繁体   English   中英

保持活动之间的状态

[英]Maintain state between activities

我的应用程序有两个活动: MasterActivityDetailActivity MasterActivity具有两种可视化模式: 列表模式地图模式 操作栏项目在它们之间切换。

当用户进入DetailActivity并返回时,我想DetailActivity选定的可视化模式。 在开始时,我使用了SharedPreferences但是即使在设备启动或长时间不活动之后,用户也将恢复以前的可视化模式,这不是我的意思。

然后,我切换到BundleonSaveInstanceState但是,当用户单击DetailActivity后退按钮时, onCreateBundle始终为空,因此我无法还原以前的可视化模式,并且始终恢复为列表模式。

应用使用Toolbar并且AndroidManifest.xml的配置如下:

<activity
    android:name=".ui.MasterActivity"
    android:label="@string/title_activity_master"
    android:theme="@style/AppTheme.NoActionBar">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>
<activity
    android:name=".ui.DetailActivity"
    android:parentActivityName=".ui.MasterActivity"
    android:theme="@style/AppTheme.NoActionBar">
    <meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value="it.returntrue.revalue.ui.MasterActivity" />
</activity>

不知道为什么onSaveInstanceState对您不起作用。 您的代码如下:

class MasterActivity extends Activity {
    private int mode;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (savedInstanceState != null)
            mode = savedInstanceState.getInt("mode");
    }

    @Override
    protected void onResume() {
        super.onResume();

        if(mode == 1) {
            //list mode
        } else {
            // map mode
        }
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putInt("mode", mode);
    }
}

尽管如此,请考虑使用Androjeta框架(由我维护)。 它具有许多功能,包括@Retain ,可以在您的情况下使用:

class MasterActivity extends BaseActivity {
    @Retain
    int mode;

    @Override
    protected void onResume() {
        super.onResume();

        if(mode == 1) {
            //list mode
        } else {
            // map mode
        }
    }
}

注意,这里MasterActivity从延伸BaseActivity所以你需要创建了。 请点击链接获取详细信息。

我有两种方法。 基本相同,但是存储数据的方式不同

  1. 使用Singleton
  2. 保持您的sharedprefs模型sharedprefs

在这两种情况下,都必须删除Activity's onDestroy方法上的值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM