【问题标题】:Why does android:label's text not changing when user changes language within my app?当用户在我的应用程序中更改语言时,为什么 android:label 的文本不会改变?
【发布时间】:2016-10-11 02:32:13
【问题描述】:

所以在我的应用中,用户看到的第一个 Activity 就是选择语言。

假设用户选择法语,然后转到 ActivityB,然后转到 ActivityC。

现在决定更改语言。

所以回到 ActivityB,然后回到第一个 Activity 并选择语言为西班牙语。

现在,当用户再次转到 ActivityB 时,片段/活动中的所有其他文本都更改为西班牙语,但 android:label 仍然是法语。如何解决这个问题?

这就是我的 ActivityA 的样子

 public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             final Bundle savedInstanceState) {

        View rootView = inflater.inflate(R.layout.fragment_choose_language, container, false);
        radioGroup = (RadioGroup) rootView.findViewById(R.id.lang_choice_radio);
        radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener()
        {
            public void onCheckedChanged(RadioGroup group, int checkedId) {
                switch(checkedId){
                    case R.id.english_lang:
                        // do operations specific to this selection
                        setLocale("en_US");
                        Intent intentEng = new Intent(getActivity(), Choose_Country.class);
                        startActivity(intentEng);
                        break;

                    case R.id.indonesian_lang:
                        // do operations specific to this selection
                        setLocale("in");
                        Intent intent = new Intent(getActivity(), Choose_Country.class);
                        startActivity(intent);
                        break;
                }
            }
        });
        return rootView;
    }

    public void setLocale(String lang) {
        myLocale = new Locale(lang);
        Resources res = getResources();
        DisplayMetrics dm = res.getDisplayMetrics();
        Configuration conf = res.getConfiguration();
        conf.locale = myLocale;
        res.updateConfiguration(conf, dm);
        Locale.setDefault(myLocale);
        onConfigurationChanged(conf);
        Intent refreshIntent = new Intent(getActivity(), ChooseLanguage.class); // refresh the activity
        refreshIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
        refreshIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(refreshIntent);
        getActivity().finish();
    }

【问题讨论】:

  • 这就是它已经到位的方式。
  • 你正在完成这一行的活动 getActivity().finish();那么用户如何导航回[From Activity B] 到这个 Activity[A] ?
  • 第 1 步:ActivityA(选择法语) --> ActivityB --> ActivityC 。第 2 步:ActivityC --> ActivityB --> ActivityA 第 3 步:ActivityA(选择西班牙语)--> ActivityB --> ActivityC。现在 ActivtyB 和 C 中的所有文本都是西班牙语。但是 ActivityB 和 ActivityC 中的标题(使用 strings.xml 中的文本)。上面的代码是 ActivityA

标签: android sharedpreferences locale onconfigurationchanged


【解决方案1】:

在我的情况下,应用程序在更改区域设置后不会更改操作栏语言。当我从最近的应用程序中删除应用程序时,它会改变,这会使应用程序完全关闭。为了解决,我在你想刷新应用程序或oncreate时使用setTitle(R.id.myapplabel),所以不需要重新启动应用程序。翻译你在 string.xml 上的活动标签,它应该可以工作。

【讨论】:

  • 现在我有另一个问题。在 ActivityA 中选择法语后,我转到 ActivityB,我看到的所有内容都是法语。但是如果我旋转手机,整个片段就会变成英文(这是默认设置)。我搜索了 Stackoverflow 的答案,例如使用 android:confgChanges="orientation|keyboard|locale"。但它不起作用。
  • 当您旋转屏幕时,您的应用会再次重新启动。所以要处理这个问题,你必须把你的 setLocale 方法和 setTitle 放到 oncreate 中的活动标签中
【解决方案2】:

解决问题的几个步骤。

  1. 将您的应用移至 ToolBar,不再使用 ActionBar

  2. 从 AndroidManifest.xml 文件中移除标签

    <activity
        android:name=".package.Activity"
        android:label=""
        android:configChanges="locale"
        android:screenOrientation="portrait"
        android:theme="@style/NoActionBar" />
    
  3. 更改区域设置时重新创建应用程序 activity.recreate()

  4. 所有活动标题都应在 strings.xml 文件中

【讨论】:

  • 这不是解决问题的方法,它只是防止它发生那么多。
  • 我们已经编写了更改语言环境的逻辑,之后我们的活动标题不会更改。所以我只是按照这种方法并得到了解决方案。如果您有更好的解决方案,请分享。 @鲨鱼
猜你喜欢
  • 1970-01-01
  • 2016-12-13
  • 2017-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-28
  • 2014-12-06
  • 2012-10-06
相关资源
最近更新 更多