至少我认为这是问题所在。从API文档:
inflate(int资源,ViewGroup root)从指定的xml资源中膨胀新视图层次结构。
我一直在与一个方向改变错误斗争已经有一段时间了,我想我已经找到了问题的根源。以下代码的行为与我的预期不同:
SeekBarTestActivity.java
public class SeekBarTestActivity extends Activity {
private LinearLayout layout;
private InflateSeekBar bar1;
private InflateSeekBar bar2;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
layout = new LinearLayout(this);
layout.setOrientation(LinearLayout.VERTICAL);
setContentView(layout);
bar1 = new InflateSeekBar(this, layout);
bar2 = new InflateSeekBar(this, layout);
}
}
InflateSeekBar.java
public class InflateSeekBar {
private SeekBar seekBar;
public InflateSeekBar(Context ctx, ViewGroup parent) {
LayoutInflater inflater = LayoutInflater.from(ctx);
View view = inflater.inflate(R.layout.seekbar_layout, null);
seekBar = (SeekBar) view.findViewById(R.id.seekBar);
seekBar.setMax(300);
parent.addView(view);
}
}
.xml资源文件与人们期望的一样,是LinearLayout中的SeekBar。我期待的是两个对象,每个对象包含一个 new SeekBar,不以任何方式彼此绑定。此外,我不希望SeekBars在方向更改上保留他们的进度,而是应该销毁它们并使用该活动重新创建。然而,第二个SeekBar不仅保留了它的进展,而且第一个SeekBars进展与第二个相匹配。我希望有人可以向我解释为什么搜索栏的行为方式如此,以便我可以利用这些知识来修复程序中的错误。感谢您提前了解任何知识。
编辑 - 已解决: 为了清楚起见,我的问题是我在SeekBars被夸大后没有给SeekBars提供唯一ID,这导致JVM在某些方面将它们视为同一个对象。感谢您的帮助Emanuel Moecklin,这个错误让我疯了!
答案 0 :(得分:1)
我期待的是两个对象,每个对象都包含一个新的SeekBar,而不是 以任何方式相互联系。
它们彼此绑定,因为它们具有相同的id(即R.id.seekBar)。当Android保存并恢复视图层次结构时,每个要保存/恢复的视图都需要一个唯一的ID:
默认实现负责处理每个实例的大部分UI 通过在每个视图上调用onSaveInstanceState()来为你状态 具有id的层次结构,并通过保存当前的id 聚焦视图(所有这些都由默认实现恢复 onRestoreInstanceState(Bundle))
因此,您需要做的是调用seekBar.setId(id),其中id是此视图层次结构中的唯一ID。你可以,例如使用此答案生成唯一ID:https://stackoverflow.com/a/21000598/534471
此外,我不希望SeekBars保持他们的进步 在方向改变时,他们应该被摧毁 通过活动重新创建。
您可以简单地覆盖onSaveInstanceState()以防止保存和恢复视图层次结构,但我怀疑从用户的角度来看这是有意义的。如果我旋转屏幕,我不想失去"我的" SeekBars。