我的活动有错误。

我在线性布局中有三个视图存根,如下所示:

<ViewStub
 android:id="@+id/index_1"
 android:layout="@layout/index_edittext"
 android:layout_width="fill_parent"
 android:layout_height="wrap_content" />
<ViewStub
 android:id="@+id/index_2"
 android:layout="@layout/index_edittext"
 android:layout_width="fill_parent"
 android:layout_height="wrap_content" />
<ViewStub
 android:id="@+id/index_3"
 android:layout="@layout/index_edittext"
 android:layout_width="fill_parent"
 android:layout_height="wrap_content" />


我的onCreate有条件地检查膨胀的东西:

for (int i = 0; i < 3; i++) {
    int id = convertIndexToId(i); //will turn i into R.id.index_1
    ViewStub stub = findViewById(id);
    if (bShouldBeSpinner) {
        stub.setLayoutResource(R.layout.index_spinner);
        View root = stub.inflate();
        Spinner spin = (Spinner)root.findViewById(R.id.my_spinner);
        spinner.setAdapter(adapter);
        spinner.setSelection(0);
    }
    else {
        stub.setLayoutResource(R.layout.index_edittext);
        View root = stub.inflate();
        EditText et = (EditText)root.findViewById(R.id.my_edittext);
        //et.phoneHome(); just kidding
        et.setText(String.valueOf(System.currentTimeMillis()));
    }
}


我强迫bShouldBeSpinner为假。 edittext的输出如下:
1300373517172
1300373517192
1300373517221

但是,当我旋转屏幕并再次调用onCreate时,输出为:
1300373517221
1300373517221
1300373517221

最初,这使我认为您只应该对视图进行一次膨胀,并且层次结构保持在onCreate的之间。但是,当我仅第一次运行它时,第二次未显示存根的视图。

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">
    <Spinner style="@style/SearchInput" android:id="@+id/my_spinner" />
</LinearLayout>

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">
    <EditText style="@style/SearchInput" android:id="@+id/my_edittext" />
</LinearLayout>


我觉得文档假设我没有注意到或遗漏了一些东西。有人看到我在做什么错吗?

编辑

我添加到视图存根android:inflatedId =“ index_1_root” ...等等

当我在for循环之后添加这些行时,这是最奇怪的事情:

EditText v = indexRoot1.findViewById(R.id.index_edit_text);
Log.d(TAG, "EditTExt: " + v);

EditText v2 = indexRoot2.findViewById(R.id.index_edit_text);
Log.d(TAG, "EditTExt: " + v2);


输出说(我相信)它们是对不同EditText的引用。


  EditTExt:android.widget.EditText@47210fe8
  EditTExt:android.widget.EditText@47212ba8


因此它们再次膨胀,但是文本设置为在第一遍时最后一个edittext设置的文本。

最佳答案

重新创建具有相同ID的不同类型的视图时,可能会出现一些问题。
ViewStub替换为膨胀视图。
我建议使用

setInflatedId(int inflatedId)


区分夸大的观点。
希望对您有所帮助。

关于android - ViewStub重新膨胀在onCreate的第一遍膨胀的最后一个 View ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5341065/

10-10 17:24