2011-10-23 1 views
8

私のアプリでシングルアクティビティマルチフラグメントデザインを実装したいと思います。私はいくつかの "スクリーン"(フラグメントのレイアウト)を用意して、コード間で切り替える(バックスタックに追加する)可能性があります。Android - 実行時にフラグメントレイアウトを変更する

各画面のフラグメントのレイアウトは、フラグメントのプレースホルダ(同じIDを共有する)として機能するレイアウトオブジェクト(FrameLayoutなど)を使用して設定されています。異なるスクリーンには異なるフラグメント配置(FrameLayoutと別のLinearLayoutなどがあります)があるので、私は疑問に思っていました:実行時にフラグメントのレイアウトを切り替えるにはどうすればいいですか?

(FragmentManagerを使用して)フラグメントの追加/置換を理解していますが、ライブアクティビティ内にそれらを含む新しいレイアウトを完全に追加したいと思います。 "setContentView"のトランザクションのようなもの...

どうすればよいですか? ありがとう!ダニー。

+0

ここにシングルアクティビティマルチフラグメントコードを掲載しました:http://stackoverflow.com/questions/7797389/how-avoid-re-initializing-activity-that-takes-a-long-time-to-initilize/ 7799391#7799391 – user999717

+0

迅速な対応をありがとうございます。しかし、私はあなたの例のような同じレイアウトのフラグメント間を切り替えると( 'R.id.mainframe')、フラグメントのレイアウトを切り替える方法である私の問題は解決しないと思います。特に、レイアウトがコードで作成されている場合(onContentViewが呼び出された後)、私の場合と同様です。 – DannyA

+0

ああ、私は、再インスタンス化せずに既存のフラグメントを再親和したいと思いますか?それは面白い。 – user999717

答えて

4

あなたがする必要があるのは、独自のIDを生成することだけです。 IDは何でもかまいませんが、aapt ID(Rのもの)と競合してはならないし、否定的であってはいけません。

次の例では、固定IDのセットでこれを示しています。

public class MainActivity extends Activity { 
    private final int ID_TABLE = 0xA; 
    private final int ID_ROW1 = 0xB; 
    private final int ID_ROW2 = 0xC; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     LinearLayout ll = (LinearLayout) findViewById(R.id.root); 
     TableLayout tl = new TableLayout(this); 
     tl.setId(ID_TABLE); 
     TableRow tr1 = new TableRow(this); 
     tr1.setId(ID_ROW1); 
     TableRow tr2 = new TableRow(this); 
     tr2.setId(ID_ROW2); 
     tl.addView(tr1); 
     tl.addView(tr2); 
     ll.addView(tl); 

     MyFragment frag1 = new MyFragment(); 
     MyFragment frag2 = new MyFragment(); 
     MyFragment frag3 = new MyFragment(); 
     MyFragment frag4 = new MyFragment(); 

     getFragmentManager().beginTransaction() 
      .add(ID_ROW1, frag1, "cell1_1") 
      .add(ID_ROW1, frag2, "cell1_2") 
      .add(ID_ROW2, frag3, "cell2_1") 
      .add(ID_ROW2, frag4, "cell2_2") 
      .commit(); 
     getFragmentManager().executePendingTransactions(); 
    } 
} 

別のレイアウトに切り替えるためには、あなたはフラグメントを除去し、他の場所でそれらを追加することができます。
どうすればいいか教えてください。

EDIT:明確にするために、ビューとビューグループを一度インスタンス化してから、アクティビティの存続期間中保持する必要はありません。関連するビューを削除する前に、フラグメントが削除または切り離されていることを確認してください。また、onCreateの外でビューを作成して削除する場合は、onSaveInstanceStateを使用してonCreateでそのプロセスを繰り返すことで、ビューを復元できることを確認する必要があります。 diagram hereと約configuration changesの段落を読んでください。

+0

努力をいただきありがとうございます!私はAndroidの初心者ですから、私はあなたを正しく理解していますか?onCreateだけでなく、私のコード内のどこでも、私のアクティビティのメインビューからビューやレイアウトを追加/削除するのは大丈夫ですか?私はこれについての例を見たことはないと思います)、その場でフラグメントを作成して追加しますか?私はそれらのための新しいレイアウトを作成するので、ちょうど "フラグメントを削除し、それらを他の場所に追加する"より少しだけです。 – DannyA

+0

最終的には、このフラグメントロジックを異なる「スクリーン」クラスに分け、各クラスに独自のレイアウトIDを知らせ、独自のフラグメントをそれらのクラスに配置することが目的です。次に、フラグメントトランザクションを介して、1つの「画面」から別の画面にナビゲートできます。例えば前の画面のすべての断片を隠し、代わりに新しい断片を表示します。私の見解は合理的だと思われますが、私は正しいデザインを見つけられていないようですが、このテクニックはちょっと変わって見えます。 – DannyA

+0

これは興味深い思いつきの列ですが、まさにこのアクティビティとそのstartActivity(意図)メソッドが作られたものではありませんか?ボタン機能も無料で利用できます。 – user999717

関連する問題