Android和菜单本地化

5

我希望能够通过编程的方式更改语言(应用程序的区域设置)。

对我来说最主要的问题是更新菜单标签。

我尝试了以下方法:

 @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;
    }

但我认为这是一个不好的想法。我希望避免使用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());

但是,由于我想要为每个活动控制旋转,它们从来没有完成。也许我做错了什么?

3个回答

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);
}

我需要你的建议,我应该用这种方式做吗?


1

你有阅读过Android本地化的文档吗?通常情况下,您需要为每种语言/区域设置创建不同的字符串文件。在menu.xml文件中,您可以引用字符串ID,根据当前的区域设置选择正确的值。


我已经完成了(我的意思是values-xx/string.xml和values/string.xml)。你是指要创建menu-xx/mymenu.xml吗? - davs
所以你有一个包含字符串menu_about的values-xx/string.xml文件和一个包含相同字符串的values-yy/string.xml文件。你将手机的语言设置为yy,但是字符串的值没有改变?你正在测试哪些语言环境?http://developer.android.com/guide/topics/resources/providing-resources.html#BestMatch讲解了如何决定使用哪个值,你可能没有正确配置你的语言环境。 - Cheryl Simon
我正在测试en/ru语言环境。但是由于我没有销毁活动,菜单没有被更新。因此,我决定清除菜单并从头开始创建它。 - davs
啊,好的,所以如果你完全退出活动并重新进入,那么它是正确的,但是你希望在停留在上面时更新它?听起来你的刷新菜单的系统在本地更改时会有意义。 - Cheryl Simon
我有一个带有菜单和偏好设置页面的主屏幕。在偏好设置页面上,我有更改语言环境的选项。我将更改语言环境的代码片段发布到了问题中。生命周期:启动具有相应语言环境的主屏幕-->打开偏好设置屏幕(但主屏幕尚未完成)-->更改语言环境-->返回到未完成的主屏幕(方法onResume调用主屏幕)。如果需要,我需要刷新菜单。 - davs

0

menu.add(0, MENU_ABOUT, 0, _mContext.getResources().getString(R.string.mymenu)).setIcon(R.drawable.ic_menu);

在创建菜单时,插入您的字符串并进行本地化。


据我所知,由于其生命周期,菜单仅为每个活动创建一次。我在创建本地化方面没有问题...当菜单已创建,然后我更改应用程序的语言环境并且我想重新加载菜单时出现问题(也许销毁它并再次创建它。但我不知道如何销毁它)。 - davs
你可以使用共享首选项,并在每次选择菜单项时更改它。如果(preferences.getBoolean("Sound", true)),则:menu.add(0, MENU_SOUND, 0, "声音").setIcon(R.drawable.on);否则:menu.add(0, MENU_SOUND, 0, "声音").setIcon(R.drawable.off); - Eby
我不想以那种方式创建菜单,因为我认为这是一个不好的做法。 - davs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接