当从后台堆叠弹出片段时,膨胀的视图会失去状态

时间:2016-10-21 06:42:46

标签: android android-fragments

我多次膨胀相同的布局并将它们添加到同一个容器视图中。这是我的工作:

layout_inflated.xml

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/parentLayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <RadioButton
        android:id="@+id/radioButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

    <EditText
        android:id="@+id/editText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"

</LinearLayout>

我对此布局进行了充气并添加到另一个视图中,如下所示:

for(int i = 0; i < 3; i++) {
    final View rowLayout = layoutInflater.inflate(R.layout.layout_inflated, null, false);
    rowLayout.setTag(i);
    containerView.addView(rowLayout);
}

然后,假设我将数字"111""222""333"输入第一行,第二行和第三行&#39; edittexts。然后我检查第3行的RadioButton,并留下第1行和第2行&#39; RadioButtons未选中。然后我移动到下一个片段,这个片段被放入backstack。然后我回到这个片段,它从backstack弹出。此时,将检查所有3个RadioButtons,并且所有edittexts的框中都有"333"。也就是说,所有行都具有第三行的状态。

但是,如果我不从同一个xml中膨胀行并创建如下所示的行,那么一切正常:

for(int i = 0; i < 3; i++) {
    LinearLayout rowLayout = new LinearLayout(context);
    rowLayout.setOrientation(HORIZONTAL);
    RadioButton radioButton = new RadioButton(context);
    EditText edittext = new EditText(context);
    rowLayout.addView(radioButton);
    rowLayout.addView(editText);
    containerView.addView(rowLayout);
}

我怀疑当我多次给同一个xml充气并将它们添加到同一个父视图时,因为它们都具有相同的ID,所以会发生一些事情并且Android无法区分它们。我真正的行布局要复杂得多,不能动态创建它,我必须从xml中扩展它。那么,任何人都可以解释为什么会发生这种情况以及如何避免它吗?

编辑:当我调试时,我发现当片段从backstack中弹出时会自动调用onTextChanged()onCheckedChanged()方法。

感谢。

1 个答案:

答案 0 :(得分:0)

我认为你的问题在一个视图中是同一元素的id。根据{{​​3}}

  

视图ID在整个树中不一定是唯一的,但最好确保它们在您正在搜索的树的部分内至少是唯一的。

正如我所知findViewById()方法将返回带有提供的id的第一次出现的View。这可能是系统使用仅从最后一个视图重新绘制视图然后从后台堆栈返回活动的原因。

所以只需从xml文件中删除android:id即可。如果您需要,请使用setId(int id)