在安卓系统中重新创建返回堆栈

12

我刚刚实现了一种在我的应用中更改主题的方法。按下按钮会在SharedPreferences中设置一个值,然后重新创建Activity,并且由于标志而更改主题。

问题是如何处理后退栈。简单地重新创建Activity并不好,因为按下硬件返回按钮将继续上一个Activity(使用旧的主题),而如果用户执行以下操作:

从Activity A开始> B> C>按下更改主题按钮>按下硬件返回按钮

那么我希望他们被带回到Activity B,并且正确应用了新主题。到目前为止,我找到的最佳解决方案是基于对象层次结构重新创建后退栈,如下所示:

    Intent intent = new Intent();
    intent.setClass(activity, activity.getClass());
    TaskStackBuilder stackBuilder = TaskStackBuilder.create(activity);
    stackBuilder.addNextIntentWithParentStack(intent);
    stackBuilder.startActivities(new Bundle());

然而我们应用程序中的Activity层级结构并没有很好地定义(即C可以有多个父Activity),因此上述代码可能会导致用户在按下返回按钮后返回到一个意想不到的Activity。

是否有一种清晰的方法可以基于实际的返回栈而不是Activity层级结构来重新构建返回栈?

1个回答

0

目前我正在使用的一个解决方案虽然不完美,但避免了对返回堆栈进行任何更改,即使用onResume()方法。

在所有活动的onResume()中,检查themeKey是否有更改,如果不同则重新创建活动。我的onCreate()设置主题,所以如果重新创建,则应用新主题。这意味着当用户通过返回堆栈移动时,如果更改了主题,它将更新。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    SharedPreferences sharedPreferences = getSharedPreferences("ThemePref", Context.MODE_PRIVATE);
    themeKey = sharedPreferences.getInt("themeKey",R.style.GM1);
    getTheme().applyStyle(themeKey,true);
    setContentView(R.layout.activity_settings);
}

@Override
protected void onResume() {
    super.onResume();
    SharedPreferences sharedPreferences = getSharedPreferences("ThemePref", Context.MODE_PRIVATE);
    int newThemeKey = sharedPreferences.getInt("themeKey",R.style.GM1);
    if (newThemeKey != themeKey){
        recreate();
    }
}

虽然晚了5年,但希望能对某些人有所帮助!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接