OnSaveInstaceState 和动态生成的布局和片段

Posted

技术标签:

【中文标题】OnSaveInstaceState 和动态生成的布局和片段【英文标题】:OnSaveInstaceState and dynamically generated layouts and fragments 【发布时间】:2015-03-10 14:30:23 【问题描述】:

在这个documentation page about onSaveInstanceState我读到:

默认实现会处理每个实例的大部分 UI 通过在每个视图上调用 onSaveInstanceState() 为您状态 具有 id 的层次结构,...

并解释为:

如果我生成一个包含ImageView IFragment FLinearLayout L

我为LIL分配了一个ID

然后在调用onSaveInstanceState(.) 时保存LIF

但是,这不会发生:如果我终止并重新打开应用程序,所有动态生成的视图都不会恢复。

代码如下:

PacketEditorFragment packetFragment = PacketEditorFragment.newInstance();
ViewGroup vg = (ViewGroup) findViewById(R.id.packetFragmentContainer);

LinearLayout linearLayout = new LinearLayout(this);

int layoutId = IDS++;
String fragmentTag = FRAGMENT_TAG + layoutId;

linearLayout.setId(layoutId);
linearLayout.setOrientation(LinearLayout.HORIZONTAL);

vg.addView(linearLayout);

DeleteImageView deleteFragmentIV = new DeleteImageView(this, layoutId, fragmentTag);
deleteFragmentIV.setId(layoutId);
deleteFragmentIV.setOnClickListener(this);
deleteFragmentIV.setImageResource(R.mipmap.ic_delete);
linearLayout.addView(deleteFragmentIV);

getSupportFragmentManager().beginTransaction()
                .add(linearLayout.getId(), packetFragment, fragmentTag)
                .commit();

该文档是否也适用于动态生成的Views?

还有一点对我来说有点模糊:Fragment 呢,它没有 ID(它是使用 String tag 添加的)。我应该以编程方式保存和恢复其状态吗? DeleteImageView 存储对 Fragment 实例的引用,并在 OnClick 侦听器方法中将其删除。

我已经看到有办法恢复片段的给定实例,但是否可以免费拥有这种行为?即使它们是动态生成的,它们仍然是活动视图层次结构的一部分。

【问题讨论】:

您是否尝试分配 R.id。什么? 你是指片段吗? 不,我是指您的视图、布局和图像视图 对不起,我不明白你指的是什么元素。除了那些动态生成的,其 id 以编程方式设置(Fragment 除外)之外,其他所有东西都有一个 id。 您的布局是由您创建的,对吗?将其 id 设置为 R.id.simething 【参考方案1】:

好的,我在阅读了这个问题Restoring view hierarchy from saved state does not restore views added programatically的接受答案后解决了这个问题。

基本上,当活动恢复时,您需要添加以编程方式添加的视图使用与您第一次创建它们时相同的 ID

这种方法对我来说没有任何意义:从 XML 文件中提供的静态布局开始,系统拥有首先重新创建活动被杀死时的布局所需的所有信息,然后传递保存的 @ 987654322@ 给每个组件。然而,它的工作方式是这样的:您需要重新创建布局并为每个组件分配其拥有的相同 ID。

【讨论】:

以上是关于OnSaveInstaceState 和动态生成的布局和片段的主要内容,如果未能解决你的问题,请参考以下文章

类的加载机制和反射——使用反射生成JDK动态代理

Linux动态链接和静态链接简析

利用js动态生成一个简单的商品详情页

js为动态生成/添加的元素绑定事件

在哪里可以使用 onSaveInstanceState 参数传递不同的Activity?

gcc生成静态库.a和动态库.so和OpenCV3.4.11的安装及使用示例