【发布时间】:2014-04-09 21:38:30
【问题描述】:
至少我相信这是问题所在。来自 API 文档:
inflate(int resource, ViewGroup root) 从指定的 xml 资源中扩充 new 视图层次结构。
一段时间以来,我一直在与方向更改错误作斗争,我想我已经隔离了问题的根源。以下代码的行为与我预期的不同:
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 膨胀后给它们唯一的 ID,导致 JVM 在某些方面将它们视为同一个对象。感谢您的帮助 Emanuel Moecklin,那个 bug 快把我逼疯了!
【问题讨论】:
-
您是否有理由无法在一个 XML 文件中创建所有视图?你膨胀你的搜索栏/线性布局的方式是......奇怪......
-
@dymmeh 在我遇到问题的程序中,InflateSeekBar 类用一堆视图扩展了一个 xml 文件。它是一种模板,这个视图集合将在我的程序中多次使用。要回答您的问题,是的,我可以这样做,但是我会多次重复代码,这不是好的 OOP。
标签: java android layout-inflater