【问题标题】:Saving whole instance of an activity保存活动的整个实例
【发布时间】:2020-12-19 00:45:08
【问题描述】:

有没有简单的方法来保存整个活动实例并恢复它?
在花了 1 小时搜索互联网的各个角落后,我最终来到了这里。我还是不知道怎么做。

是的,我知道如何使用 onSaveInstanceStateonRestoreInstanceState 保存当前实例 但互联网上没有人用大量复杂的编码来解释它,比如动态创建的视图、许多 textviews 和计算等。

每个人都只用一两个 textViews 来解释它,而我是像 “如何有人可以创建一个只有几个 TextViews 的应用程序!?!” 如下所示:

onSaveInstanceState()

protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    Log.i(TAG, "onSaveInstanceState");
    
    final EditText textBox = 
            (EditText) findViewById(R.id.editText);
    CharSequence userText = textBox.getText();
    outState.putCharSequence("savedText", userText);

}

onRestoreInstanceState()

    @Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
   super.onRestoreInstanceState(savedInstanceState);
   Log.i(TAG, "onRestoreInstanceState");

   final EditText textBox =
        (EditText) findViewById(R.id.editText);

   CharSequence userText =
                savedInstanceState.getCharSequence("savedText");

   textBox.setText(userText);
}

我完全可以理解上述方法。但是,如果我们完成了一个相当复杂的编码并想要保存和恢复状态我已经完成了所有复杂的编码工作并遇到了这个问题,该怎么办。
我相信会有一个简单的方法来实现这一点。请理解我的问题。帮我。

【问题讨论】:

  • 有趣的问题。你的观点有多复杂?基本上,您应该只保存活动/视图的状态/数据,并根据恢复的状态/数据恢复其视图。如果您的视图需要很长时间才能恢复,那么可能值得尝试改进视图层次结构。
  • 好的。想象一下,有一个按钮可以在 onClick 事件中从另一个布局文件中扩展线性布局中的一行文本视图。该行可能包含任意数量的视图,具体取决于另一个用户输入,例如 Spinner 项目。看,它已经变得复杂了。与真实事物相比,这种复杂性算不了什么...... :)
  • 我会调查是否值得迁移您从数据模型中膨胀视图的逻辑。在任何事件(如点击)上,您都会生成一个新的数据模型。然后,您可以从该数据模型创建您的视图。您可以随时保存和恢复该数据模型。
  • android studio 是一个 IDE,它只是帮助你编写代码。您的应用没有什么不同,因为您使用的是 android studio 来开发它,所以除非您有与 android-studio 相关的问题,否则请不要使用 android-studio 标签

标签: android onsaveinstancestate onrestoreinstancestate


【解决方案1】:

如果我理解正确的话,即使页面发生变化,你也想保存页面的当前状态,如果是这种情况,可以通过数据绑定来解决,如下所示:
1.在Gradle中启用数据绑定
2.在XML文件中将你的布局放入布局标签

<layout>
 ...// your activity view layout
</layout>
  1. 然后在您的活动中定义它:

    私有 lateinit var 绑定:FragmentNameBinding

4.在onCreate或onCreateView中添加这个表达式(对于fragment)

if (!(::binding.isInitialized)) {
  //initialize you layout file and what ever you want 
   }
  //then initialize what you want to not change  after the layout 
  changed and back to it
  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-14
    • 2021-02-23
    • 1970-01-01
    相关资源
    最近更新 更多