2017-11-18 114 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

相關問題