2012-04-02 11 views
20

Androidアクティビティでは、レイアウトの特定の位置に1つのビューを(実行時に)動的に追加する必要があります。追加するビューは実行時に決定されます。たとえば、レイアウトは次のようになります。動的に追加されたビューのAndroidレイアウトプレースホルダ

<LinearLayout ...> 
    <TextView ... /> 
    <!-- Dynamic item to be added here --> 
    <TextView ... /> 
</LinearLayout> 

これを達成する最も良い方法は何ですか?

解決策の1つはlayout.addView(view, index)ですが、インデックスをハードコードしたくない場合があります。

別の解決策は、プレースホルダとしてでframeLayoutを使用することで、その場所がでframeLayout内部動的ビューは、例えば:

<LinearLayout ...> 
    <TextView ... /> 
    <FrameLayout android:id="@+id/placeholder" /> 
    <TextView ... /> 
</LinearLayout> 

そして:

findViewById(R.id.placeholder).addView(view); 

しかし、これは、不必要なビューを追加します階層内にある。

これを行うにはどのような方法が適していますか?

答えて

13

「実行時に追加された」ビューのプレースホルダとしてFrameLayoutを使用するとよい解決策だと思います。

パフォーマンス上の余計な「不要な」ビューの影響については心配しません。

+1

ありがとうございました。私は 'findViewById(R.id.placeholder).addView(view);'を使用して終了しました。プレースホルダはFrameLayoutや、ScrollViewのように最後に追加する必要がある場合は他のレイアウトにすることができます。 – Ralf

+0

そのようなネストされたビューの深いツリーが表示されることがあります。これは、UIスレッドのスタックサイズが制限されているため、stuckoverflowerrorが発生する場合があります。 –

7

Android開発者のarticle(これよりかなり古い)に記載されているように、ViewStubを使用してこの「怠惰なインクルード」動作を達成することもできます。

+1

"lazy include"の場合は、私は(実行時に決定される)いくつかのビューの1つを追加できる必要があります。私は明確にするために質問を編集しました。 – Ralf

+1

ViewStubで指定されたレイアウトファイルは、空のLinearLayout、RelativeLayout、...任意の数の.AddView()で動的に取り込むことができるWhateverLayoutにすることができます。なぜ私は上記のように動作しないのか分かりません(実際には今実装しています)。 – samosaris

+2

ViewStub stub =(ViewStub)findViewById(R.id.container_stub); stub.setLayoutResource(R.layout.activity_home); ViewStubについて – frostymarvelous

1

正確なインデックスをハードコードすることなく、addView(View child、int index)を使用できます。

ビューのネイバーの1つを修正することができます(たとえば、アイテムを挿入する場所の直前に特定のラベルがある場合など)。そのビューのインデックスを取得し、その後にダイナミックビューを挿入できます。

View previousView = findViewById(ID_OF_PREVIOUS_VIEW); 
ViewGroup parent = (ViewGroup)previousView.getParent(); 
int previousIndex = parent.indexOfChild(previousView); 
parent.addView(theDynamicallyCreatedView, previousIndex + 1); 

それとも、ViewStubを使用しますが、代わりにレイアウトを膨張させる、それを削除することができます。

View placeholder = findViewById(ID_OF_STUB); 
ViewGroup parent = (ViewGroup)previousView.getParent(); 
int index = parent.indexOfChild (placeholder); 
parent.removeViewAt(index); 
parent.addView(theDynamicallyCreatedView, index); 

あなたは巨大なビュー階層で終わるません。この道を。

関連する問題