【问题标题】:Is it possible to recreate activity and keep the runtime instance?是否可以重新创建活动并保留运行时实例?
【发布时间】:2013-02-20 19:07:21
【问题描述】:

我创建了一个 SettingsActivity 让用户设置偏好。 偏好之一是肤色。

    Intent settingIntent = new Intent(this, SettingsActivity.class);
    startActivity(settingIntent);

一旦用户完成设置,他/她会点击“完成”按钮返回 MainActivity。

    Intent intent = new Intent();
    intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
    intent.setClass(this, MainActivity.class);
    startActivity(intent);
    finish();

但 MainActivity 并没有真正改变。

我意识到我只应用了 onCreate() 中的更改

    setTheme(SettingsActivity.getSkinColor()); // Get the preference from SharedPreference
    setContentView(R.layout.mylayout);

在这种情况下,我认为我必须重新创建活动。所以我将 intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT) 更改为 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)

但是,当用户点击“完成”按钮时,它会创建一个新的 MainActivity。

有没有办法在不重新创建活动的情况下应用 setTheme?或者至少在我创建一个新实例时保留所有运行时实例和状态?

【问题讨论】:

    标签: android android-activity android-preferences android-theme


    【解决方案1】:

    向 Intent 添加 Extras,为新启动的 Activity 提供运行时状态和正确配置自身所需的主题信息。

    【讨论】:

    • 如果我仍然想使用 intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT) 来恢复堆栈中的活动。有没有办法使用intent.putExtra() 来传递数据。或者有没有办法在我关闭设置活动时设置回调。
    【解决方案2】:

    您无需强制重新创建活动。

    在您的主要活动的onResume() 中,您可以检查主题是否已更改。如果是这样,只需调用setTheme(),然后再次调用setContentView(),这将使用新主题重新创建您的布局。请记住重做所有findViewById() 调用,因为您的所有View 对象都已重新创建。

    【讨论】:

    • 假设我调用 setTheme(android.R.style.Theme_Light)。如何检查主题是否更改为另一个 resId?
    • 您可以在 onCreate() 中调用 getTheme() 并记住在成员变量中。在onResume() 再次调用getTheme() 并进行比较。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-03
    • 2016-12-04
    • 2012-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多