【问题标题】:Change language for the whole application inside a fragment?更改片段内整个应用程序的语言?
【发布时间】:2017-11-18 05:14:07
【问题描述】:

假设这是调用堆栈:

Fragment2(当前位置)

片段1

托管活动

用户刚刚导航到 fragment2(即设置屏幕)。他选择了第二种语言,然后导航回 Fragment1。我希望应用程序在他进入 fragment1 后立即显示第二语言的内容。

我了解到,最好的方法是让所有片段派生自一个基本片段,该片段在OnResume() 方法中配置语言环境。

public class BaseFragment : Fragment
{
    public override void OnResume()
    {
        string langCode = prefs.GetString("settings_language", "en_US");

        Resources res = Application.Context.Resources;
        // Change locale settings in the app.
        DisplayMetrics dm = res.DisplayMetrics;
        Configuration conf = res.Configuration;
        conf.SetLocale(new Locale(langCode.ToLower()));

        res.UpdateConfiguration(conf, dm);
        OnConfigurationChanged(conf);

        base.OnResume();
    }
}

我已经尝试过了,但没有任何运气。我没有看到任何变化。 我愿意听取任何建议。

PS。为了确保我没有弄乱值文件夹中 Android 要求的任何命名约定,我尝试使用我想要的语言重新启动模拟器(使用 adb shell)并且它按预期工作。

【问题讨论】:

标签: c# localization xamarin.android


【解决方案1】:

您可以创建一个像这样设置CurrentCulture 的基类并从中继承:

internal class MyBaseActivity : Activity
{
    protected override void OnResume ()
    {
        base.OnResume ();

        // Get the language from wherever.
        var userSelectedCulture = new CultureInfo ("fr-FR");

        Thread.CurrentThread.CurrentCulture = userSelectedCulture;
    }
}

下面是如何继承和使用它:

public class MainActivity : MyBaseActivity
{
    protected override void OnResume()
    {
        base.OnResume();  // Do not forget to call base.OnResume()
        // Rest of Your Code...
    }
}

【讨论】:

  • 我知道这适用于活动,但正如我所提到的 - 我已经尝试过这种方法,但我很难使用片段进行这项工作。使用这种方法处理 Fragment,你有什么运气吗?
猜你喜欢
  • 1970-01-01
  • 2020-06-23
  • 1970-01-01
  • 2018-08-31
  • 1970-01-01
  • 2017-05-09
  • 2015-05-09
  • 2013-08-08
  • 1970-01-01
相关资源
最近更新 更多