【问题标题】:Android save activity dynamically created layout in onPauseAndroid在onPause中保存活动动态创建的布局
【发布时间】:2017-08-31 11:43:45
【问题描述】:

所以我想暂时保存我的 Activity 布局。我的布局是在 LinearLayout 中创建的,通过添加像 ll.addView(btn); 这样的子元素 但是当我转到另一个 Intent 并且该 Intent 完成时,所有添加的按钮都会消失。我怎样才能防止这种情况发生?

【问题讨论】:

  • 你为什么要这样做?
  • 从服务接收数据。当用户选择数据时 -> 显示它们的活动 -> 返回数据选择
  • 尽管这里有所有答案,但您应该检查一下,为什么要重新创建您的活动。
  • @JacksOnF1re 它没有被重新创建。它只是暂停了,它的状态丢失了

标签: android android-layout android-intent android-activity


【解决方案1】:

您必须实现onSaveInstanceState(Bundle) 和onRestoreInstanceState(Bundle)。

在onSaveInstanceState 中,您将动态创建视图所需的信息存储在包中。

在onRestoreInstanceState 中,您从包中获取此信息并重新创建动态布局。

类似:

@Override
public void onSaveInstanceState(Bundle bundle) {
  bundle.putString("key", "value"); // use the appropriate 'put' method
  // store as much info as you need
  super.onSaveInstanceState(bundle);
}

@Override
public void onRestoreInstanceState(Bundle bundle) {
  super.onRestoreInstanceState(bundle);
  bundle.getString("key"); // again, use the appropriate 'get' method.
  // get your stuff
  // add views dynamically
}

或者,您可以从onCreate 方法而不是onRestoreInstanceState 方法恢复布局的动态视图。您决定什么是最适合您的。

【讨论】:

  • onCreate 不能替代 onRestoreInstanceState。
  • @BirendraSingh 是的。来自文档:“onCreate() 和 onRestoreInstanceState() 回调方法都接收包含实例状态信息的相同 Bundle。” developer.android.com/guide/components/activities/…
  • 来自同一页面您可以选择实现onRestoreInstanceState(),而不是恢复onCreate()期间的状态,系统在onStart()方法之后调用它 。如果有人实现 onStart() 来初始化一些状态变量,那么逻辑就会中断。
  • 如果活动暂停,那么onCreate() 将无济于事。
  • @BirendraSingh 所以?它仍然是一个替代方案。这是否是最好的方法将取决于所讨论的情况。有时,恢复onCreate() 中的实例状态是一种避免冗余代码的方法。如果onCreate 不打算用于恢复实例状态,那么这种可能性将永远不会存在于框架中,特别是如果您认为onCreate(Bundle) 和onRestoreInstanceState 从API 级别1 起都可用。同样,选择@ 987654340@或onRestoreInstanceState恢复数据视情况而定。
【解决方案2】:
You can make use of onSaveInstanceState to save the view and 
onRestoreInstanceState to retrieve the saved view.

private String someVarB;

...

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);

    outState.putString("btn_added", "true");
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);

    someVarB = savedInstanceState.getString("btn_added");

    if(someVarB.equalsIgnoreCase(true))
    {
         ll.addView(btn); 
    }

}

【讨论】:

    【解决方案3】:

    要防止 Activity 的内容在您每次使用 Intent() 操作调用时总是更新,请转到 Manifest 文件并将标签添加到名为 `android:launchMode="singleTask" 的 Activity。 这是一个例子

    <activity
            android:name=".MainActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:label="@string/app_name"
            android:launchMode="singleTask"
            android:screenOrientation="portrait"
            android:theme="@style/AppTheme.TranscluscentBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
    
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    

    【讨论】:

    • 据我所知,这将为活动创建另一个启动器
    • 不,我从我的项目中复制了这个 sn-p,在我的 MainActivity 上使用了启动模式(这也是启动器活动)。我要解释的是 android:launchMode="singleTask"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-16
    相关资源
    最近更新 更多