LayoutInflater不返回新对象

时间:2014-04-09 21:38:31

标签: java android layout-inflater

至少我认为这是问题所在。从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,这个错误让我疯了!

1 个答案:

答案 0 :(得分: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。