ViewStub повторно раздувает последний вид, раздуваемый при первом проходе onCreate - PullRequest
1 голос
/ 17 марта 2011

У меня есть ошибка с моей активностью.

У меня есть три заглушки вида в моей линейной компоновке, например, так:

<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" />

my 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.Вывод текста редактирования выглядит следующим образом:
1300373517172
1300373517192
1300373517221

Однако, когда я поворачиваю экран и onCreate вызывается во второй раз, вывод выглядит так:
1300373517221
1300373517221
1300373517221

Первоначально это заставило меня подумать, что вы должны раздувать представление только один раз, и иерархия сохраняется в промежутке между onCreate's ... однако, когда я запускаю его только в первый раз во второй раз, нетдля заглушек показаны виды.

<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

Таким образом, они снова раздуваются, но текстустановить, какой последний текст редактирования был установлен на первом проходе.

Ответы [ 2 ]

1 голос
/ 17 марта 2011

Вместо того, чтобы использовать ViewStubs, я добавил id в корень этих заглушек (android: id = "index_roots") и использовал

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

, чтобы решить эту проблему, однако я не приму этот ответЯ сразу же позволю другим ответить тем же методом, что и я.

1 голос
/ 17 марта 2011

При воссоздании представлений разных типов с одинаковым идентификатором могут возникнуть некоторые проблемы. ViewStub заменен раздутым видом.
Я предлагаю использовать

setInflatedId(int inflatedId)

для различения завышенных взглядов.
Надеюсь, что поможет.

...