FragmentManager.getFragment

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追加される
Fragment追加される

Fragment追加される。
FButton1を押すと、

数字が増えて
数字が増えて

数字が増えて、横にすると、

Fragmentは再生成されるが0
Fragmentは再生成されるが0

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
mCurrentFragmentはnull

mCurrentFragmentはnull。

Button1で追加されたら
Button1で追加されたら

Button1で追加されたら、

中に入ってる
中に入ってる

中に入ってる。
ただし、

横にして再生成されると
横にして再生成されると

横にして再生成されると、

Activityも再生成されるので、またnullになってしまう。
Activityも再生成されるので、またnullになってしまう。

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で追加されてる

onCreateで追加されてる。

横にした場合は、onCreateのsavedInstanceStateはnullではないので、既に追加されてる以上、追加処理をする必要はない
横にした場合は、onCreateのsavedInstanceStateはnullではないので、既に追加されてる以上、追加処理をする必要はない

横にした場合は、onCreateのsavedInstanceStateはnullではないので、既に追加されてる以上、追加処理をする必要はない。
ただし、

そうすると、mCurrentFragmentはnullになってしまう。
そうすると、mCurrentFragmentはnullになってしまう。

そうすると、mCurrentFragmentはnullになってしまう。
そこで、onSaveInstanceState/onRestoreInstanceState、そしてputFragment/getFragmentが必要になってくる。

こんな風にすることで、

起動時
起動時

起動時、

しっかり追加されている。
しっかり追加されている。

しっかり追加されている。

回転しても
回転しても

回転しても、

復元されている
復元されている

復元されている。
もちろん、永続化ではないので、インスタンスが同じものというわけではない。

Sample/android/FragmentManager/getFragment/src/FragmentManager at master · bg1bgst333/Sample · GitHub