2012-04-13 19 views
13

tôi có một hoạt động và trong onCreate i tải ngôn ngữ từ sở thích và thiết lập một miền địa phương như thế này:android locale thay đổi một cách ngẫu nhiên trở lại để mặc định

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    String lang = PreferenceManager.getDefaultSharedPreferences(this).getString("locale", "en"); 
    Locale newLocale = new Locale(lang); 
    Locale.setDefault(newLocale); 

    Configuration config = new Configuration(); 
    config.locale = newLocale; 

    final Resources res = getResources(); 
    res.updateConfiguration(config, res.getDisplayMetrics()); 
} 

tôi cũng ghi đè onConfigurationChanged

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 

    String lang = PreferenceManager.getDefaultSharedPreferences(this).getString("locale", "en"); 
    Locale newLocale = new Locale(lang); 
    Locale.setDefault(newLocale); 

    Configuration config = new Configuration(); 
    config.locale = newLocale; 

    final Resources res = getResources(); 
    res.updateConfiguration(config, res.getDisplayMetrics()); 
} 

tôi có một ViewPager với FragmentPagerAdapter và ba tab trên Android 2.3.7. vấn đề là, đôi khi khi chuyển đổi tab, miền địa phương của ứng dụng được hoàn nguyên về tiếng Anh, do đó giao diện người dùng có ngôn ngữ hỗn hợp từ bây giờ trở đi. tôi luôn tạo các mảnh mới cho các tab trong phương thức getItem() của adapter. nếu tôi xoay thiết bị, miền địa phương lại đúng.

tôi cũng đã thử đặt android: configChanges = "locale" trong tệp kê khai và không ghi đè trênConfigurationChanged(), nhưng kết quả là như nhau.

điều tồi tệ nhất là, nó không phải là 100% tái sản xuất, nó sẽ xảy ra chỉ một số lần và tôi cũng có báo cáo từ người dùng về việc này. một khi ứng dụng bắt đầu và nó không thay đổi ngôn ngữ sau khi chuyển đổi vài tab, sau đó nó sẽ chính xác cho đến khi thoát.

Trả lời

10

Sau một thời gian tôi đã tìm ra cách. Giải pháp duy nhất phù hợp với tôi là luôn đặt locale trong onCreate(), trong mỗi onCreateView() của mỗi Fragment, trong onReceive() của mọi BroadcastReceiver() (nếu nó tải một số tài nguyên) và ở đầu mỗi Dịch vụ. Đối với điều này tôi đã thực hiện một phương thức tĩnh setLocale() trong hoạt động chính và duy nhất của tôi. Nếu bạn có nhiều hoạt động hơn, nó có thể được đặt trong một lớp Ứng dụng tùy chỉnh.

Một điều cuối cùng. Ngay cả điều này một số lần không hoạt động nếu ứng dụng được bắt đầu trực tiếp từ IDE để gỡ lỗi. Đừng lo lắng, nó hoạt động (ít nhất là cho tôi) nếu nó chạy bình thường trên thiết bị.

public static void setLocale(Context context) { 
    final String lang = PreferenceManager.getDefaultSharedPreferences(context).getString("locale", "en"); 
    final Locale newLocale = new Locale(lang); 
    Locale.setDefault(newLocale); 
    final Configuration config = new Configuration(); 
    config.locale = newLocale; 

    final Resources res = context.getResources(); 
    res.updateConfiguration(config, res.getDisplayMetrics()); 
} 
Các vấn đề liên quan