2013-08-21 38 views
5

Tôi muốn ngôn ngữ của mình thay đổi động và tôi đang cố gắng sử dụng onConfigurationChanged nhưng nó không được gọi. Tôi có một MainActivity tạo thanh tác vụ và viewpager của tôi. Phần còn lại của các trang của tôi là Fragments. Trong SettingsFragment của tôi, tôi có một nút để chuyển ngôn ngữ sang tiếng Pháp.Ngôn ngữ: onConfigurationChanged không được gọi là

langChange.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View vi) { 
      MainActivity main = (MainActivity)getActivity(); 
      main.langChange(); 
     } 

}); 

Sau đó, trong MainActivity của tôi, tôi có

@Override 
public void onConfigurationChanged(Configuration newConfig){ 
    super.onConfigurationChanged(newConfig); 
    if (locale != null){ 
     newConfig.locale = locale; 
     Locale.setDefault(locale); 
     getBaseContext().getResources().updateConfiguration(newConfig, getBaseContext().getResources().getDisplayMetrics()); 
    } 
} 

public void langChange(){ 
    if(currentLanguage == FRENCH_LANGUAGE){ 
     locale = new Locale("en"); 
     Locale.setDefault(locale); 
     Configuration c = getBaseContext().getResources().getConfiguration(); 
     c.locale = locale; 
     getBaseContext().getResources().updateConfiguration(c,getBaseContext().getResources().getDisplayMetrics()); 
     currentLanguage = "English"; 
    } 
    else if(currentLanguage == ENGLISH_LANGUAGE){ 
     locale = new Locale("fr"); 
     Locale.setDefault(locale); 
     Configuration c = getBaseContext().getResources().getConfiguration(); 
     c.locale = locale; 
     getBaseContext().getResources().updateConfiguration(c,getBaseContext().getResources().getDisplayMetrics()); 
     currentLanguage = "French"; 
    } 
    actionBar.setSelectedNavigationItem(actionBar.getTabCount() - 1); //This just puts it back to the settings tab 
} 

Các onConfigurationChanged không được gọi. Trong biểu hiện của tôi, tôi có:

<activity android:name="MainActivity" android:screenOrientation="portrait" android:configChanges="locale"></activity> 

Tôi đã thử thêm một hoặc tất cả các tùy chọn này orientation|keyboardHidden|screenSize không thành công.

Lý do cho tất cả điều này là vì tôi muốn thay đổi văn bản ActionBar và tất cả văn bản khác khi tôi nhấp vào nút. Tôi có một tập tin dây riêng cho tiếng Pháp.

Mọi trợ giúp đều tuyệt vời.

+0

Làm thế nào để bạn biết rằng 'onConfigurationChanged' không được gọi? Bạn có một kiểm tra cho 'null' xung quanh mã bên trong phương thức, đó có thể là vấn đề. Ngoài ra hãy xem câu hỏi này: http://stackoverflow.com/questions/6457659/android-onconfigurationchanged-not-being-called – Darwind

+0

Tôi đã thêm các điểm ngắt trước và sau câu lệnh if với 'Log.d'. Tôi biết nó không trúng phương pháp này. Tôi cũng đã xem xét các câu hỏi trên và những câu trả lời không giải quyết vấn đề của tôi – BigT

Trả lời

4

Ok, tôi đã xem xét điều này một chút.

Tôi không chắc chắn, tại sao phương pháp onConfigurationChanged không được gọi, vì vậy tôi hy vọng ai đó có thể khai sáng cho chúng tôi về phần này.

Trong tìm kiếm của mình, tôi tình cờ gặp phải điều này tutorial, thực sự thay đổi Locale, bằng cách thay đổi cấu hình.

Mã của bạn trông rất giống hướng dẫn này thực sự ;-)

Anyways, điều quan trọng về các hướng dẫn và mã là phương pháp này:

private void updateTexts() { 
    txt_hello.setText(R.string.hello_world); 
    btn_en.setText(R.string.btn_en); 
    btn_ru.setText(R.string.btn_ru); 
    btn_fr.setText(R.string.btn_fr); 
    btn_de.setText(R.string.btn_de); 
} 

Đây là nơi các "kỳ diệu" xảy ra ; sau khi bạn đã thay đổi miền địa phương, bạn sẽ cần phải tải lại tài nguyên của mình và vì bạn đã nói với Android rằng bạn muốn tự mình xử lý một số cấu hình, bạn cần phải tải lại toàn bộ văn bản của mình bằng cách đặt lại các mục giao diện người dùng.

Khi điều này được thực hiện, ứng dụng sẽ tải các chuỗi từ thư mục địa phương cụ thể.

Câu trả lời cho lý do tại sao Android cư xử theo cách này, có thể được tìm thấy trong các official documentation cho Activity nói:

[...]

này được thực hiện vì bất kỳ tài nguyên ứng dụng, bao gồm các file layout , có thể thay đổi dựa trên bất kỳ giá trị cấu hình nào. Do đó, cách an toàn duy nhất để xử lý thay đổi cấu hình là truy xuất lại tất cả các tài nguyên, bao gồm bố cục, bản vẽ và chuỗi. Vì các hoạt động phải đã biết cách lưu trạng thái của chúng và tự tạo lại trạng thái đó từ trạng thái đó, đây là một cách thuận tiện để có một hoạt động khởi động lại chính nó với một cấu hình mới.

Anh ấy viết hướng dẫn đủ để thêm toàn bộ dự án hướng dẫn dưới dạng tải xuống, vì vậy tôi khuyên bạn nên kiểm tra xem nó hoạt động như thế nào, vì nó đang hoạt động ;-) Bạn có thể xem xét onConfigurationChanged phương pháp, vì nó dường như không làm bất cứ điều gì.

Hy vọng điều này sẽ hữu ích.

+0

Bạn là một vị thần cho việc tìm kiếm này. Nó là hoàn hảo. Một vài thay đổi tôi phải làm để phù hợp với nó xung quanh mã của tôi nhưng hoạt động hoàn hảo !!!! Cảm ơn – BigT

+0

Bất cứ lúc nào - Tôi thích đào bới xung quanh ;-) – Darwind

6

Bạn phải xác định android: configChanges = "layoutDirection | locale" để onConfigurationChanged() được gọi.

+0

điều này thực sự không hoạt động –

+3

Anh ấy hoàn toàn đúng, việc thêm 'layoutDirection' hoạt động, không có. – marco

+0

Điều đó cũng có hiệu quả đối với tôi, bạn có biết bất kỳ ý tưởng nào đằng sau điều đó không? –

Các vấn đề liên quan