ViewStub重新定义onCreate第一次传递时膨胀的最后一个视图

时间:2011-03-17 15:15:58

标签: android xml view viewstub

我的活动存在错误。

我的线性布局中有三个视图存根,如此 -

<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为false。 edittext的输出如下:
1300373517172个
1300373517192个
1300373517221

然而,当我旋转屏幕并且第二次调用onCreate时输出为:
1300373517221个
1300373517221个
1300373517221

最初这让我认为你应该只对视图进行一次充气,并且heirarchy保持在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);

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

  

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

所以他们再次被充气,但文本被设置为第一次传递时最后一个edittext设置的内容。

2 个答案:

答案 0 :(得分:1)

使用相同的ID重新创建不同类型的视图时可能会出现一些问题。 ViewStub被膨胀的视图取代 我建议使用

setInflatedId(int inflatedId)

区分膨胀的观点。
希望有所帮助。

答案 1 :(得分:1)

我没有使用ViewStubs,而是在这些存根的根目录中添加了一个id(android:id =“index_roots”)并使用了

view.addView( (isSpinner) ? 
    new Spinner(this) : new EditText(this) ); 

要解决这个问题,我不会马上接受这个答案,我会允许其他人使用我想要的方法回答。