我刚刚实现了一种在我的应用中更改主题的方法。按下按钮可在SharedPreferences中设置一个值,然后重新创建活动,并且由于该标志而更改主题。
问题是如何处理后台堆栈。简单地重新创建活动并不好,因为按下硬件后退按钮将恢复之前的活动(旧主题仍然设置),而如果用户执行以下操作:
从活动A开始> B> C>按主题更改按钮>按硬件后退按钮
然后我希望将它们带回活动B 并正确应用新主题。我到目前为止找到的最佳解决方案是根据对象层次重建背斜堆,如下所示:
Intent intent = new Intent();
intent.setClass(activity, activity.getClass());
TaskStackBuilder stackBuilder = TaskStackBuilder.create(activity);
stackBuilder.addNextIntentWithParentStack(intent);
stackBuilder.startActivities(new Bundle());
然而,我们的应用程序中的活动层次结构没有很好地定义(即C可以有多个父项),因此上面的代码可能导致用户在按下后退按钮后被带回到意外活动。
是否有一种干净的方法可以根据实际的后台堆栈而不是活动层次结构来重建后台堆栈?
答案 0 :(得分:0)
我目前使用的一种解决方案是使用onResume()方法,该解决方案虽然不是完美的,但是避免了必须对Backstack进行任何更改。
在所有活动的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年为时已晚,但希望能对某人有所帮助!