为了账号安全,请及时绑定邮箱和手机立即绑定

更改应用程序内部的区域设置

更改应用程序内部的区域设置

慕田峪4524236 2019-06-15 17:25:44
更改应用程序内部的区域设置我的用户可以在应用程序中更改区域设置(他们可能希望保持他们的电话设置的英语,但阅读我的应用程序的内容法语,荷兰语或任何其他语言.)为什么这个在1.5/1.6中工作得很好,但在2.0中就不再正常了?@Overridepublic boolean onOptionsItemSelected(MenuItem item) {     switch(item.getItemId()) {     case 201:         Locale locale2 = new Locale("fr");          Locale.setDefault(locale2);         Configuration config2 = new Configuration();         config2.locale = locale2;         getBaseContext().getResources().updateConfiguration(             config2, getBaseContext().getResources().getDisplayMetrics());         // loading data ...         refresh();         // refresh the tabs and their content         refresh_Tab ();         break;      case 201: etc...问题是,每当用户通过上面的代码行时,菜单“收缩”的次数就会越来越多.这是缩小的菜单:@Overridepublic boolean onCreateOptionsMenu(Menu menu) {     menu.add(0, 100, 1, "REFRESH").setIcon(android.R.drawable.ic_menu_compass);     SubMenu langMenu = menu.addSubMenu(0, 200, 2, "NL-FR").setIcon(android.R.drawable.ic_menu_rotate);         langMenu.add(1, 201, 0, "Nederlands");         langMenu.add(1, 202, 0, "Français");     menu.add(0, 250, 4, R.string.OptionMenu2).setIcon(android.R.drawable.ic_menu_send);     menu.add(0, 300, 5, R.string.OptionMenu3).setIcon(android.R.drawable.ic_menu_preferences);     menu.add(0, 350, 3, R.string.OptionMenu4).setIcon(android.R.drawable.ic_menu_more);     menu.add(0, 400, 6, "Exit").setIcon(android.R.drawable.ic_menu_delete);     return super.onCreateOptionsMenu(menu);}在API级别5中,我应该做些什么才能使它再次工作呢?这就是我发现的:<uses-sdk android:minSdkVersion="5" />它运转得很好.。<uses-sdk android:minSdkVersion="3" />>每次更改地区时,菜单都会缩小!由于我想让用户在1.5上访问我的应用程序,我应该做什么?
查看完整描述

3 回答

?
梦里花落0921

TA贡献1772条经验 获得超6个赞

在AndroidM中,最好的解决方案是行不通的。我编写了一个助手类来修复您应该从应用程序类和所有活动中调用的内容(我建议创建一个BaseActivity,然后使所有的活动继承它)。

这也将支持正确的RTL布局方向。

帮助者班:

public class LocaleUtils {

    private static Locale sLocale;

    public static void setLocale(Locale locale) {
        sLocale = locale;
        if(sLocale != null) {
            Locale.setDefault(sLocale);
        }
    }

    public static void updateConfig(ContextThemeWrapper wrapper) {
        if(sLocale != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            Configuration configuration = new Configuration();
            configuration.setLocale(sLocale);
            wrapper.applyOverrideConfiguration(configuration);
        }
    }

    public static void updateConfig(Application app, Configuration configuration) {
        if (sLocale != null && Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) {
            //Wrapping the configuration to avoid Activity endless loop
            Configuration config = new Configuration(configuration);
            // We must use the now-deprecated config.locale and res.updateConfiguration here,
            // because the replacements aren't available till API level 24 and 17 respectively.
            config.locale = sLocale;
            Resources res = app.getBaseContext().getResources();
            res.updateConfiguration(config, res.getDisplayMetrics());
        }
    }}

申请:

public class App extends Application {
    public void onCreate(){
        super.onCreate();

        LocaleUtils.setLocale(new Locale("iw"));
        LocaleUtils.updateConfig(this, getBaseContext().getResources().getConfiguration());
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        LocaleUtils.updateConfig(this, newConfig);
    }}

基本活动:

public class BaseActivity extends Activity {
    public BaseActivity() {
        LocaleUtils.updateConfig(this);
    }}


查看完整回答
反对 回复 2019-06-15
  • 3 回答
  • 0 关注
  • 482 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信