アプリはアクティビティ(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();}
}
}
}
しかし、私は最初に回転の前に断片が存在するかどうかを確認しています。そうでなければ、ELSEブロックにフラグメントを追加しています。私は正しい? @Bob –
ボタンをクリックしたときにreplaceを呼び出すためです。 Replaceは、コンテナ内の追加されたすべてのフラグメントを削除し、渡した最新のフラグメントのみを追加します。だから、もしあなたがそのフラクタルで置き換えられれば、フラクタとフラブはなくなったのです。オリエンテーションを変更した後、それらのフラグメントは再び追加されます。詳細:https://developer.android.com/reference/android/app/FragmentTransaction.html#replace(int、android.app.Fragment、java.lang.String) – Bob