【发布时间】:2015-03-10 14:30:23
【问题描述】:
在这个documentation page about onSaveInstanceState我读到:
默认实现会处理每个实例的大部分 UI 通过在每个视图上调用 onSaveInstanceState() 为您状态 具有 id 的层次结构,...
并解释为:
如果我生成一个包含
ImageView I和Fragment F的LinearLayout L我为
L、I和L分配了一个ID然后在调用
onSaveInstanceState(.)时保存L、I和F
但是,这不会发生:如果我终止并重新打开应用程序,所有动态生成的视图都不会恢复。
代码如下:
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