2017-08-17 7 views
1

アプリはアクティビティ(FrameLayoutのみを含む)と3つのFragments(すべて構造が同じですが、ボタンはありますが背景色が異なります)で構成されています。オリエンテーションの変更後、フラグメントマネージャは最後に表示されたフラグメントを画面に復元しますか?

アクティビティが最初に作成されると、すべてのフラグメントが置き換えられて1つずつFrameLayoutに挿入されます。画面上の(フラグメントの)ボタンをクリックすると、現在のフラグメントが別のフラグメントに置き換えられます。

スクリーンローテーションでは、回転直前に表示されていたフラグメントに関係なく、アプリケーションが最初に起動したときに表示されたフラグメントがアクティビティに表示されるという問題がありました。

どうしてですか?なぜ、最後に表示されたフラグメントが画面に復元されないのですか?

私はonSavedInstanceStateを使用できることを知っていますが、もっと重要なのは、FragmentManagerの仕組みを学びたいと思っています。

主な活動:

public class MainActivity extends AppCompatActivity implements ActivityInstance { 

    fraga a; 
    fragb b; 
    fragc c; 
    FragmentManager fm; 

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


     if (fm.findFragmentByTag("a")!=null){ 
      a = (fraga) fm.findFragmentByTag("a"); 
     } 
     else { 
      a = new fraga(); 
      FragmentTransaction ft = fm.beginTransaction(); 
      ft.add(R.id.frame, a, "a"); 
      ft.commit(); 
     } 

     if (fm.findFragmentByTag("b")!=null){ 
      b = (fragb) fm.findFragmentByTag("b"); 
     } 
     else { 
      b = new fragb(); 
      FragmentTransaction fx = fm.beginTransaction(); 
      fx.add(R.id.frame, b, "b"); 
      fx.commit(); 
     } 

     if (fm.findFragmentByTag("c")!=null){ 
      c = (fragc) fm.findFragmentByTag("c"); 
     } 
     else { 
      c = new fragc(); 
      FragmentTransaction fl = fm.beginTransaction(); 
      fl.add(R.id.frame, c, "c"); 
      fl.commit(); 
     } 

    } 

    public void changefrag(int i) { //This method is called by the fragment 
            using the ActivityInstance interface 
     switch (i){ 
      case 1: FragmentTransaction f1 = fm.beginTransaction().replace(R.id.frame, a, "a"); 
        f1.commit(); 
        break; 
      case 2: FragmentTransaction f2 = fm.beginTransaction().replace(R.id.frame, b, "b"); 
        f2.commit(); 
        break; 
      case 3: FragmentTransaction f3 = fm.beginTransaction().replace(R.id.frame, c, "c"); 
        f3.commit(); 
        break; 
      default: 
        {Toast.makeText(this, "default", Toast.LENGTH_SHORT).show();} 
     } 
    } 
} 

答えて

4

FragmentManagerが最後を復元するには、姿勢変更後fragmentを表示します。 Activityから向きが変更されるたびに新しいfragmentが追加されたようです。したがって、最後のフラグメントをカバーする新しいフラグメントが最後のフラグメントに追加されます。

onCreatefragmentを追加するのは、savedInstanceStateがnullの場合に限られます。 savedInstanceStateは初めてのみnullになります。方向変更後はnullになりません。

if (savedInstanceState == null) { 
    // add your fragment 
} 
// else - don't add fragment, because all the fragments are restored automatically 
+0

しかし、私は最初に回転の前に断片が存在するかどうかを確認しています。そうでなければ、ELSEブロックにフラグメントを追加しています。私は正しい? @Bob –

+0

ボタンをクリックしたときにreplaceを呼び出すためです。 Replaceは、コンテナ内の追加されたすべてのフラグメントを削除し、渡した最新のフラグメントのみを追加します。だから、もしあなたがそのフラクタルで置き換えられれば、フラクタとフラブはなくなったのです。オリエンテーションを変更した後、それらのフラグメントは再び追加されます。詳細:https://developer.android.com/reference/android/app/FragmentTransaction.html#replace(int、android.app.Fragment、java.lang.String) – Bob

関連する問題