FragmentManager.getFragmentで、保存しておいたFragmentの参照を取得する。
FragmentManager | Android Developers
改めて、今挿入しているFragmentをmCurrentFragmentとして参照を持ち、それを操作するような場合、どのような形がいいかを検証していく。
まず、MainActivity.javaを、
package com.bgstation0.android.sample.fragmentmanager_; import android.app.Activity; import android.app.Fragment; import android.app.FragmentManager; import android.app.FragmentTransaction; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.Toast; //メインアクティビティ public class MainActivity extends Activity implements OnClickListener{ // 生成時 @Override protected void onCreate(Bundle savedInstanceState) { // 既定の処理. super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Button1の処理. Button button1 = (Button)findViewById(R.id.button1); // button1を取得. button1.setOnClickListener(this); // リスナーとしてthisをセット. } // クリック時 public void onClick(View v){ // FragmentManager, fragmentTransactionの取得. FragmentManager fragmentManager = getFragmentManager(); // fragmentManagerの取得. FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); // fragmentTransactionの取得. Fragment1 fragment1 = new Fragment1(); // fragment1を生成. fragmentTransaction.add(R.id.framelayout1, fragment1); // fragment1を追加. fragmentTransaction.commit(); // コミット. } }
こうする。
まだ、mCurrentFragmentを用意してない。
Buttonを押したらFragmentを追加する状況。
起動時。
Button1を押すと、
Fragment追加される。
FButton1を押すと、
数字が増えて、横にすると、
Fragmentは再生成されるが0。
さて、ここにmCurrentFragmentを入れてみる。
package com.bgstation0.android.sample.fragmentmanager_; import android.app.Activity; import android.app.Fragment; import android.app.FragmentManager; import android.app.FragmentTransaction; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.Toast; //メインアクティビティ public class MainActivity extends Activity implements OnClickListener{ // メンバフィールド. Fragment mCurrentFragment = null; // mCurrentFragmentをnullで初期化. // 生成時 @Override protected void onCreate(Bundle savedInstanceState) { // 既定の処理. super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Button1の処理. Button button1 = (Button)findViewById(R.id.button1); // button1を取得. button1.setOnClickListener(this); // リスナーとしてthisをセット. // mCurrentFragmentのチェック. if (mCurrentFragment == null){ Log.d("MainActivity", "onCreate:mCurrentFragment == null"); } else{ Log.d("MainActivity", "onCreate:mCurrentFragment = " + mCurrentFragment.toString()); } } // クリック時 public void onClick(View v){ // FragmentManager, fragmentTransactionの取得. FragmentManager fragmentManager = getFragmentManager(); // fragmentManagerの取得. FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); // fragmentTransactionの取得. Fragment1 fragment1 = new Fragment1(); // fragment1を生成. fragmentTransaction.add(R.id.framelayout1, fragment1); // fragment1を追加. fragmentTransaction.commit(); // コミット. mCurrentFragment = fragment1; // mCurrentFragmentにfragment1をセット. Log.d("MainActivity", "onClick:mCurrentFragment = " + mCurrentFragment.toString()); } }
追加をしたときにmCurrentFragmentにfragment1を格納する。
起動時は、
mCurrentFragmentはnull。
Button1で追加されたら、
中に入ってる。
ただし、
横にして再生成されると、
Activityも再生成されるので、またnullになってしまう。
ここで2つのことを実現したい。
1つ目は、起動時にFragmentが追加されていること。
2つ目は、回転してもFragmentの参照が格納されていること。
1つ目は、
package com.bgstation0.android.sample.fragmentmanager_; import android.app.Activity; import android.app.Fragment; import android.app.FragmentManager; import android.app.FragmentTransaction; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.Toast; //メインアクティビティ public class MainActivity extends Activity implements OnClickListener{ // メンバフィールド. Fragment mCurrentFragment = null; // mCurrentFragmentをnullで初期化. // 生成時 @Override protected void onCreate(Bundle savedInstanceState) { // 既定の処理. super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Button1の処理. Button button1 = (Button)findViewById(R.id.button1); // button1を取得. button1.setOnClickListener(this); // リスナーとしてthisをセット. // savedInstanceStateのチェック. if (savedInstanceState == null){ // nullの時. // FragmentManager, fragmentTransactionの取得. FragmentManager fragmentManager = getFragmentManager(); // fragmentManagerの取得. FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); // fragmentTransactionの取得. Fragment1 fragment1 = new Fragment1(); // fragment1を生成. fragmentTransaction.add(R.id.framelayout1, fragment1); // fragment1を追加. fragmentTransaction.commit(); // コミット. mCurrentFragment = fragment1; // mCurrentFragmentにfragment1をセット. } // mCurrentFragmentのチェック. if (mCurrentFragment == null){ Log.d("MainActivity", "onCreate:mCurrentFragment == null"); } else{ Log.d("MainActivity", "onCreate:mCurrentFragment = " + mCurrentFragment.toString()); } } // クリック時 public void onClick(View v){ // FragmentManager, fragmentTransactionの取得. //FragmentManager fragmentManager = getFragmentManager(); // fragmentManagerの取得. //FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); // fragmentTransactionの取得. //Fragment1 fragment1 = new Fragment1(); // fragment1を生成. //fragmentTransaction.add(R.id.framelayout1, fragment1); // fragment1を追加. //fragmentTransaction.commit(); // コミット. //mCurrentFragment = fragment1; // mCurrentFragmentにfragment1をセット. //Log.d("MainActivity", "onClick:mCurrentFragment = " + mCurrentFragment.toString()); } }
これまでも出てきたonCreate時のsavedInstanceStateのnullチェック分岐で実現する。
その代わり、Buttonはもう実質使わない。
起動時に既に追加されている。
この時はsavedInstanceStateはnullだからね。
onCreateで追加されてる。
横にした場合は、onCreateのsavedInstanceStateはnullではないので、既に追加されてる以上、追加処理をする必要はない。
ただし、
そうすると、mCurrentFragmentはnullになってしまう。
そこで、onSaveInstanceState/onRestoreInstanceState、そしてputFragment/getFragmentが必要になってくる。
こんな風にすることで、
起動時、
しっかり追加されている。
回転しても、
復元されている。
もちろん、永続化ではないので、インスタンスが同じものというわけではない。