关于这个documentation page about onSaveInstanceState,我读到了:
默认实现负责处理每个实例的大部分UI 通过在每个视图上调用onSaveInstanceState()来为你状态 具有id的层次结构......
并解释为:
如果我生成的LinearLayout L
包含ImageView I
和Fragment F
我将ID分配给L
,I
和L
然后在调用L
时保存I
,F
和onSaveInstanceState(.)
但是,这不会发生:如果我终止并重新打开应用程序,则不会恢复所有动态生成的视图。
代码如下:
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();
该文档是否也适用于以{din}方式生成的View
?
还有一点对我来说有点模糊:Fragment
怎么样,没有ID(使用String tag
添加)。我应该以编程方式保存和恢复其状态吗? DeleteImageView
存储对Fragment
实例的引用,并在OnClick
侦听器方法中删除它。
我已经看到有办法恢复片段的给定实例,但是有可能免费获得这种行为吗?即使它们是动态生成的,它们仍然是活动视图层次结构的一部分。
答案 0 :(得分:0)
好的,我在阅读了这个问题Restoring view hierarchy from saved state does not restore views added programatically的接受答案后解决了这个问题。
基本上,当活动恢复后,您需要添加以编程方式添加的视图,其中包含您第一次创建时使用的相同ID 。
这种方法对我没有任何意义:从XML文件中提供的静态布局开始,系统具有首先重新创建活动在被杀死时所具有的布局所需的所有信息,然后传递已保存的{ {1}}到每个组件。但是,这是它的工作方式:您需要重新创建布局并为每个组件分配相同的ID。