2011-08-21 9 views
4

開発者ガイドでは、実行時にFragmentをプログラム時に既存のViewGroupに追加することができます。私の質問は次のとおりです:ViewGroupはどのようにアプリケーションにリンクされていますか?ViewGroupへのフラグメントの追加

これまでは、アプリケーションのレイアウトを記述したxmlファイルにViewGroupを宣言しようとしました。しかし、をpublic abstract FragmentTransaction add (int containerViewId, Fragment fragment, String tag)関数を使用して追加しようとすると、アプリケーションがクラッシュします(immediatlyではなく、アプリケーションのonCreate機能の最後)。

私が実際にやりたいことは、アプリケーション内でいくつかのビュー(Fragmentとして実装)を管理し、ユーザーの選択に応じてそれらを切り替えることです。私のアプローチで何を追加(または変更)しなければならないのですか?

あなたが私を助けるために過ごす時間を事前に感謝します。

+0

Eclipseで 'adb logcat'、DDMS、またはDDMSパースペクティブを使ってLogCatを調べ、クラッシュに関連するスタックトレースを調べます。 – CommonsWare

答えて

5

のViewGroupはあなたがNEXを行う必要があるフラグメントと、このフレームを交換するためにその後

<FrameLayout 
android:id="@+id/fragmentForChange" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
/> 

シンプルなフレームレイアウトすることができます:

Bundle args = new Bundle();   
// add needed args 

//create fragment and set arguments  
Fragment fragment= MyFragment(); 
fragment.setArguments(args) 

FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
// getSupportFragmentManager - uses for compatible library instead of getFragmentManager 

//replace frame with our fragment 
ft.replace(R.id.fragmentForChange,fragment); 
//set type of animation 
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); 

//finish transaction 
ft.commit(); 

あなたはコマンドを使用して、トランザクションに表示または非表示の断片できます。

ft.hide(fragment);   
ft.show(fragment);   
+0

追加は置き換えられません。 –

1

詳細を指定しなかったため、クラッシュの理由がわかりませんそれはちょうどあなたにヒントを送ってくれました(私のために働きました.Fragment APIはそれほど直感的ではありません)。

FragmentTransactionで作成されたFragmentは、直ちに追加されるのではなく、独自の裁量で(後でUIスレッドがビジーでない場合がある)、FragmentのgetView()呼び出しがしばらくの間nullを返す可能性があるこれはクラッシュの原因となる可能性があります。

APIの残りの部分が同期的なので、Googleがこのように設計した理由はわかりません.FrangmentをXMLレイアウトの一部として(インフレータを使用して)作成すると、作成されますgetViewは常に値を返します。

これは回避策です:あなたが別のレイアウトインフレプロセスの一部としてViewGroupを作成すると、それが効果的かもしれません。

関連する問題