2017-11-18 98 views
0

比方说,这是调用堆栈:在片段中更改整个应用程序的语言?

Fragment2(当前位置)

片段1

HostingActivity

用户刚刚导航到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文件夹中搞乱Android所需的任何命名约定,我尝试使用我想要的语言重新启动模拟器(使用adb shell),并按预期工作。

+0

@ YorkShen-MSFT我我不完全确定如何使用'tags'会有什么不同。你能解释一下吗? – rasperryPi

+0

参考:https://stackoverflow.com/questions/38022709/android-refresh-current-fragment-after-language-change –

回答

0

您可以创建一个基类,设置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... 
    } 
} 
+0

我知道这适用于活动,但正如我所说 - 我已经尝试过这种方法,我我很难用碎片做这件事。你有没有运气使用这种方法的碎片? – rasperryPi

+0

这种方法有效吗? – rasperryPi

相关问题