2011-12-16 4 views
11

コードに直進しましょう。findViewByIdは、<include>ビューでnullを返します。

活動コード、のonCreateメソッド

setContentView(R.layout.main); 

View main_view = findViewById(R.id.main_view); 
View view_flipper = main_view.findViewById(R.id.vf); 
View first_tab = view_flipper.findViewById(R.id.prev_pane); 

main.xmlレイアウトコード:

<ViewFlipper android:id="@+id/vf" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    > 

    <include android:id="@+id/prev_pane" layout="@layout/vf_inner" /> 
<include android:id="@+id/cur_pane" layout="@layout/vf_inner" /> 
    <include android:id="@+id/next_pane" layout="@layout/vf_inner" /> 
</ViewFlipper> 

問題! メインビューが正しく検出されているため、ViewFlipperもありますが、prev_paneまたはcur_paneまたはnext_paneが見つからない場合は、NULLポインタが戻されます。なぜどんなアイデア?

このアクティビティは、インテントを使用してタブを介して呼び出されます。

を含んですべての参照は、私は、変数を検査するとき、私は<include />タグがあなたのUIのhierachyにおける実際のビューではないためだmChildren

答えて

8

にvf_innerレイアウトの内容を見つけるのidのを除いて正しく解決されています。 彼らはアンドロイドツールのコピーの&の貼り付け指示の多くです。

実行時にペインを検索する場合は、含まれているレイアウトのルート要素にIDを追加します。こうして彼らはfindViewById()で見つけることができます。

+0

まあ、すべてのペインは同じですが、それぞれ異なる内容が必要です。どうすればこれを達成できますか?ファクトは、すべて含まれるビューにイメージとID付きのテキストビューが含まれています。イメージは静止したままですが、テキストはすべてのペインで異なります。 – Artis

+0

ああ、そうだ。私は、XMLに関しては(少なくとも私には気づいていない)*という点では限られていると思う。あなたはコードからこれを構築することができます。レイアウトインフレータサービスを使ってレイアウトの3つのインスタンスを膨張させるには、膨張したビューで 'setId()'を使います。その後、 'findViewById()'を介してViewFlipperを検索し、 'ViewFlipper.addView()'で3つのレイアウトを追加します。 –

+3

[ViewFlipper.getChildAt(index) '](http://developer.android.com/reference/android/view/ViewGroup.html#getChildAt(int))を介してViewFlipperの子を参照することもできます。彼らのidの代わりに。例えば。 'View first_tab = view_flipper.getChildAt(0)'のようになります。 –

0

あなたができることの1つは、親レイアウトの中に<include>ステートメントをラップすることです(メインの親レイアウトの子です)。あなたはfindViewByIdそれぞれ別々にすることができますので、それらのビューに異なるIDを与えます。

+0

これらはviewflipperの子として扱われることになるので、ビュー数が固定されていれば問題はありません。 – josephus

+0

+1正解、私はこの可能性を逃した。あなたが子供に割り当てられたIDを必要とするなら、それは働きます。これらを必要としない場合は、代わりに 'ViewFlipper.getChildAt()'を使用してください。その理由は、ビューの階層を可能な限りフラットに保つ必要があるからです。ディープネストされたビューの階層はパフォーマンスに大きな影響を与えます。 –

関連する問題