2016-10-07 1 views
2

マイコード:これは、プログラムによってフラグメントを呼び出す正しい方法ですか?

public class MainActivity extends AppCompatActivity { 
    private FragmentA fragmentA; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     if (savedInstanceState == null) { 
      fragmentA = FragmentA.newInstance(); 
      FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); 
      fragmentTransaction.replace(R.id.fragment_a_container, fragmentA, "FRAGMENT_A"); 
      fragmentTransaction.commit(); 
     } 
     else { 
      fragmentA = (FragmentA) getSupportFragmentManager().findFragmentByTag("FRAGMENT_A"); 
     } 
    } 

} 

私は本当に私がやっているかわからないが、これは私が何をすべきか、現在あります。私はFragmentのコンテナを定義し、FragmentTransactionを使用してそれをFragmentに置き換えます。私が混乱している部分はelse文です。

  1. これを別の方法で構成する必要がありますか?

  2. 私は設定変更がアクティビティとフラグメントを一掃したと思ったのですが、一部のサポートマネージャでフラグメントをチェックするのはなぜですか?これは断片が実際に破壊されないことを意味しますか?同時に、私はonSaveInstanceStateまたはアプローチを使用しない限り、リセットされているように見えるので、破壊されているようです。

編集:これを行うと間違って何:

public class MainActivity extends AppCompatActivity { 
    private FragmentA fragmentA; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     fragmentA = FragmentA.newInstance(); 
     FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); 
     fragmentTransaction.replace(R.id.fragment_a_container, fragmentA, "FRAGMENT_A"); 
     fragmentTransaction.commit(); 
    } 

} 

答えて

1

彼らは、この場合は、SupportFragmentManagerによって破壊され、構成の変更であなたのために再作成されますか。

は、あなたの質問に答えるために:

  1. は私が異なっこれを構成する必要がありますか。

いいえ、それはあなたが何も保存された状態が存在しない場合の断片を作成し、そこにあるときにそれらを取得する必要がありますどのように正確です。私の答えhereも見てください。

  1. )なぜ一部のサポートマネージャでフラグメントをチェックするのですか?

構成変更があったときにマネージャがフラグメントのライフサイクルを処理するためです。

  1. b)フラグメントが実際に破棄されないという意味ですか?

いいえ、それは破壊されます。参考までにdiagramを参照してください。

編集は、コメントからご質問のいくつかに答えるために:

しかし、私はその断片のonSaveInstanceStateに保存しない限り、その断片内の任意のメンバ変数が完全に右、設定変更で失われますか?

これは間違いありません。あなたの断片が破壊されているので、onSaveInstanceStateに保存されていないものはすべて失われます。

それでは、私は正確に何を復元していますか?

あなたは何も復元していません。以前に作成されたフラグメントへの参照のみを取得しています。フラグメントのonRestoreInstanceState()メソッドで変数を復元します。

これを行う際に何が問題になっていますか(質問の編集コード)?

これを行うと、新しいフラグメントインスタンスがR.id.fragment_a_containerコンテナに追加されます。したがって、古い断片はあなたがonSaveInstanceState()に保存した状態とともに失われます。それは新しい情報とそれに新しい情報であり、イベントonRestoreInstanceState()が呼び出されません。

+0

まだ分かりません。 'fragmentA =(FragmentA)getSupportFragmentManager()。findFragmentByTag(" FRAGMENT_A ");'正しいですか?またはこれを削除して、常に最初のコードブロックにあるコードを呼び出すことはできますか? (トランザクションコード) – KaliMa

+0

以前に作成したフラグメントを取得する方法であるため、これを保持する必要があります。 「FRAGMENT_A」タグは、あなたのフラグメントをマネージャーと識別するタグです。 –

+0

しかし、画面を回転してアクティビティーとフラグメントを破壊すると、フラグメントが「fragmentA」メンバーと再関連付けできるところで、どのように「存在」することができますか? – KaliMa

関連する問題