在运行时更改语言环境时刷新(重新创建)后台堆栈中的活动

Posted

技术标签:

【中文标题】在运行时更改语言环境时刷新(重新创建)后台堆栈中的活动【英文标题】:Refresh(recreate) the activities in back stack when change locale at run time 【发布时间】:2018-12-08 09:20:11 【问题描述】:

我有一个活动说 ActivityMain 从这个活动我移动到另一个名为 ActivitySettings 的活动并在设置活动中我通过单击一个按钮来更改应用程序区域设置,并使用重新创建我实现了我需要的更改当前活动,但当我按回时,我的“ActivityMain”将恢复,但区域设置未更新。

有人可以告诉我如何“重新创建”后台活动吗?什么是正确的方法。

我不能在刷新时调用重新创建,因为它将是无限循环

【问题讨论】:

看这里developer.android.com/training/basics/intents/result 【参考方案1】:

在每个Activity的onCreate()你可以维护currentLangCode。检查onResume()中的这个值,如果不同,你可以断定语言环境发生了变化,recreate()

你可以这样做:

public class ActivityA extends AppCompatActivity
    private String currentLangCode;
     @Override
    protected void onCreate(Bundle savedInstanceState) 
        ...
        currentLangCode = getResources().getConfiguration().locale.getLanguage();
        ...
    
    @Override
    public void onResume()
        ...
        if(!currentLangCode.equals(getResources().getConfiguration().locale.getLanguage()))
            currentLangCode = getResources().getConfiguration().locale.getLanguage();
            recreate();
        
    
    ...

我的建议

如果您想将其应用于所有活动,则只需按如下方式创建 BaseActivity:

public class BaseActivity extends AppCompatActivity
    private String currentLangCode;
     @Override
    protected void onCreate(Bundle savedInstanceState) 
        ...
        currentLangCode = getResources().getConfiguration().locale.getLanguage();
        ...
    
    @Override
    public void onResume()
        ...
        if(!currentLangCode.equals(getResources().getConfiguration().locale.getLanguage();))
            currentLangCode = getResources().getConfiguration().locale.getLanguage();
            recreate();
        
    
    ...

BaseActivity扩展所有活动

public class ActivityA extends BaseActivity

     @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        ...
    
    @Override
    public void onResume()
      super.onResume();
    
    ...

【讨论】:

当然。告诉我。 getResources().getConfiguration().locale.getLanguage() 这并没有给出改变的语言它仍然给我旧的语言并且条件总是flase我通过检查shareprefs来解决我在哪里保存更改的语言 @Praneeth,刚刚测试了这个值,它为我返回了正确的值。 @Praneeth,我也一样

以上是关于在运行时更改语言环境时刷新(重新创建)后台堆栈中的活动的主要内容,如果未能解决你的问题,请参考以下文章

当我在android中更改应用程序中的语言环境时如何重新加载当前视图

在页面重新加载/刷新时重置会话?

Android Fragment 和 Activity 在方向更改时的行为

C#Reflection - 如何在运行时重新加载类?

应用程序崩溃后更改手机语言并从后台重新启动

React页面不会在url查询更改时重新呈现