1

アクティビティにバグがあります。

線形レイアウトに3つのビュースタブがあります-

<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に強制します。 エディットテキストの出力は次のとおり です
。130037351717213003735171921300373517221

ただし、画面を回転させてonCreateが2回呼び出されると、出力は次のようになります
。1300373517221
1300373517221
1300373517221

最初は、ビューを1回だけ膨らませるべきだと思いました。階層は、onCreateの間に保持されます...ただし、2回目だけ実行すると、スタブのビューは表示されません。

<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

したがって、それらは再び膨らみますが、テキストは最初のパスで最後の編集テキストが設定されたものに設定されます。

4

2 に答える 2

1

ViewStubsを使用する代わりに、それらのスタブのルート(android:id = "index_roots")にIDを追加して使用しました

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

この問題を解決するために、私はこの答えをすぐには受け入れません。私が行っていた方法を使用して他の人が答えることを許可します。

于 2011-03-17T19:46:51.517 に答える
1

同じ ID を持つ異なるタイプのビューを再作成すると、問題が発生する場合があります。ViewStub はインフレートされたビューに置き換えられました。
使用することをお勧めします

setInflatedId(int inflatedId)

膨張したビューを区別します。
その助けを願っています。

于 2011-03-17T16:18:38.013 に答える