gpt4 book ai didi

android - 在 Android 中重新创建 backstack

转载 作者:行者123 更新时间:2023-12-03 13:25:56 25 4
gpt4 key购买 nike

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

问题是如何处理backstack。简单地重新创建 Activity 并不好,因为按下硬件后退按钮将恢复上一个 Activity (仍然设置旧主题),而如果用户执行以下操作:

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

然后我希望他们被带回 Activity B 正确应用了新主题 .到目前为止,我发现的最佳解决方案是根据对象层次结构重新创建 backstack,如下所示:

    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 层次结构来重建后台堆栈?

最佳答案

我现在使用的一种解决方案是使用 onResume() 方法,虽然它并不完美,但可以避免对后台堆栈进行任何更改。
在所有 Activity 的 onResume() 中,检查主题键的变化。如果不同,则重新创建 Activity 。我的 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年太晚了,但希望它可以帮助别人!

关于android - 在 Android 中重新创建 backstack,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31197843/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com