【问题标题】:LayoutInflater not returning a new objectLayoutInflater 不返回新对象
【发布时间】: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


【解决方案1】:

我期待的是两个对象,每个对象都包含一个新的 SeekBar,而不是 以任何方式相互联系。

它们相互关联,因为它们具有相同的 id(即 R.id.seekBar)。当 Android 保存和恢复视图层次结构时,每个要保存/恢复的视图都需要一个唯一的 id:

默认实现会处理每个实例的大部分 UI 通过在每个视图上调用 onSaveInstanceState() 为您状态 具有 id 的层次结构,并通过保存当前的 id 聚焦视图(所有这些都由默认实现恢复 onRestoreInstanceState(Bundle))

http://developer.android.com/reference/android/app/Activity.html#onSaveInstanceState(android.os.Bundle)

因此,您需要调用 seekBar.setId(id) ,其中 id 是此视图层次结构中的唯一 id。你可以例如使用此答案生成唯一 ID:https://stackoverflow.com/a/21000598/534471

此外,我不希望 SeekBars 保持他们的进步 在方向改变时,它们应该被销毁并 与活动一起重新创建。

您可以简单地重写 onSaveInstanceState() 以防止视图层次结构被保存和恢复,但我怀疑从用户的角度来看这是否有意义。如果我旋转屏幕,我不想失去“我的”SeekBars 的位置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-10
    • 1970-01-01
    • 1970-01-01
    • 2021-05-28
    • 2014-12-08
    相关资源
    最近更新 更多