Android和菜单本地化

dav*_*avs 5 android localization menu

我想以编程方式更改语言(应用程序的语言环境).

我的主要问题是更新菜单标签.

我尝试了以下方法:

 @Override
public boolean onMenuOpened(int featureId, Menu menu) {
    if (shouldChangeMenuLabels) {
        for (int i = 0; i < menu.size(); i++) {
            MenuItem menuItem = menu.getItem(i);
            switch (menuItem.getItemId()) {
                case R.id.menu_main_about:
                    menuItem.setTitle(R.string.menu_about);
                    break;
                case R.id.menu_main_preferences:
                    menuItem.setTitle(R.string.menu_prefs);
                    break;
            }
        }
        shouldChangeMenuLabels = false;
    }
Run Code Online (Sandbox Code Playgroud)

但我确定这是个坏主意.我想避免使用switch-case语句,因为这不是通用方法(我不能简单地将剪切端口移植到其他活动/我不能创建抽象类,这样做).


顺便说一句,所有菜单都被描述为menu/*.xml文件,所以我不想复制代码.有人有想法吗?

关注第一个答案:我使用以下代码更改了语言环境:

            Locale locale = new Locale((String)newValue);
            Locale.setDefault(locale);
            Configuration config = new Configuration();
            config.locale = locale;
            getApplication().getResources().updateConfiguration(config, getApplication().getResources().getDisplayMetrics());
Run Code Online (Sandbox Code Playgroud)

但是,由于我想控制每个活动的旋转,它们永远不会完成.也许我做错了什么?

dav*_*avs 5

我不知道这是个好主意,但我发现了以下方式:

 @Override
public boolean onMenuOpened(int featureId, Menu menu) {
    if (shouldChangeLocale) {
        menu.clear();
        MenuInflater inflater = getMenuInflater(); // -->onCreateMenu (Menu) 
        inflater.inflate(R.menu.menu_main, menu);  // /
        shouldChangeLocale=false;
    }

    return super.onMenuOpened(featureId, menu);
}
Run Code Online (Sandbox Code Playgroud)

我需要你的建议,我应该这样做吗?