Fragment.onActivityCreated

Fragment.onActivityCreatedは、Activityの生成が完了した時に呼ばれる。

Fragment  |  Android Developers

Fragment1.javaで、

package com.bgstation0.android.sample.fragment_;

import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;

//フラグメント1
public class Fragment1 extends Fragment {

	// メンバフィールド
	static final String TAG = "Fragment1";	// TAGを"Fragment1"で初期化.
	
	// コンストラクタ
	public Fragment1(){
		
	}
	
	// フラグメント生成時
	@Override
	public void onCreate(Bundle savedInstanceState){
		
		// 既定の処理.
		super.onCreate(savedInstanceState);	// 親クラスのonCreateを呼ぶ.
		
		// ログを残す.
		Log.d(TAG, "Fragment1.onCreate");	// "Fragment1.onCreate"とログに残す.
		
	}
	
	// フラグメント破棄時
	@Override
	public void onDestroy(){
		
		// ログを残す.
		Log.d(TAG, "Fragment1.onDestroy");	// "Fragment1.onDestroy"とログに残す.
		
		// 既定の処理.
		super.onDestroy();	// 親クラスのonDestroyを呼ぶ.
		
	}
	
	// ビュー生成時
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
		
		// ログを残す.
		Log.d(TAG, "Fragment1.onCreateView");	// "Fragment1.onCreateView"とログに残す.
		
		// 既定の処理.
		super.onCreateView(inflater, container, savedInstanceState);
		
		// MainActivityのEditTextの内容を取得.
		MainActivity mainActivity = (MainActivity)getActivity();	// mainActivityを取得.
		EditText activityEdittext1 = (EditText)mainActivity.findViewById(R.id.activityedittext1);	// activityEdittext1を取得.
		Log.d(TAG, "activityEdittext1 = " + activityEdittext1.getText().toString());	// activityEdittext1をログ出力.
		
		// Fragment1のEditTextを取得.
		View view = inflater.inflate(R.layout.fragment1_main, null);	// inflater.inflateでR.layout.fragment1_mainからビューを作成.
		EditText fragmentEdittext1 = (EditText)view.findViewById(R.id.fragmentedittext1);	// fragmentEdittext1を取得.
		Log.d(TAG, "fragmentEdittext1 = " + fragmentEdittext1.getText().toString());	// fragmentEdittext1をログ出力.
		return view;	// viewを返す.
		
	}
	
	// アクティビティ生成完了時
	@Override
	public void onActivityCreated(Bundle savedInstanceState){
		
		// ログを残す.
		Log.d(TAG, "Fragment1.onActivityCreated");	// "Fragment1.onActivityCreated"とログに残す.
				
		// 既定の処理.
		super.onActivityCreated(savedInstanceState);
		
		// MainActivityのEditTextの内容を取得.
		MainActivity mainActivity = (MainActivity)getActivity();	// mainActivityを取得.
		EditText activityEdittext1 = (EditText)mainActivity.findViewById(R.id.activityedittext1);	// activityEdittext1を取得.
		Log.d(TAG, "onActivityCreated#activityEdittext1 = " + activityEdittext1.getText().toString());	// activityEdittext1をログ出力.
		
	}
	
}

onActivityCreatedで、activityEdittext1の内容を見てみた。

既にこの状態にしておく
既にこの状態にしておく

既にこの状態にしておく。

回転させる
回転させる

回転させる。

この時でも空である
この時でも空である

この時でも空である。
ActivityのViewが生成されていても以前の状態を復元するのはもっと後である。
では、onActivityCreatedに意味はあるのか。
目的を変更してみる。
MainActivity.javaで、

onCreateのmStrに"AAA"をセットし、onCreateの最後に"BBB"に変更する。
Fragment1.javaは、

package com.bgstation0.android.sample.fragment_;

import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;

//フラグメント1
public class Fragment1 extends Fragment {

	// メンバフィールド
	static final String TAG = "Fragment1";	// TAGを"Fragment1"で初期化.
	
	// コンストラクタ
	public Fragment1(){
		
	}
	
	// フラグメント生成時
	@Override
	public void onCreate(Bundle savedInstanceState){
		
		// 既定の処理.
		super.onCreate(savedInstanceState);	// 親クラスのonCreateを呼ぶ.
		
		// ログを残す.
		Log.d(TAG, "Fragment1.onCreate");	// "Fragment1.onCreate"とログに残す.
		
	}
	
	// フラグメント破棄時
	@Override
	public void onDestroy(){
		
		// ログを残す.
		Log.d(TAG, "Fragment1.onDestroy");	// "Fragment1.onDestroy"とログに残す.
		
		// 既定の処理.
		super.onDestroy();	// 親クラスのonDestroyを呼ぶ.
		
	}
	
	// ビュー生成時
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
		
		// ログを残す.
		Log.d(TAG, "Fragment1.onCreateView");	// "Fragment1.onCreateView"とログに残す.
		
		// 既定の処理.
		super.onCreateView(inflater, container, savedInstanceState);
		
		// MainActivityのEditTextの内容を取得.
		MainActivity mainActivity = (MainActivity)getActivity();	// mainActivityを取得.
		EditText activityEdittext1 = (EditText)mainActivity.findViewById(R.id.activityedittext1);	// activityEdittext1を取得.
		Log.d(TAG, "activityEdittext1 = " + activityEdittext1.getText().toString());	// activityEdittext1をログ出力.
		Log.d(TAG, "mainActivity.mStr = " + mainActivity.mStr);	// mainActivity.mStrを出力.
		
		// Fragment1のEditTextを取得.
		View view = inflater.inflate(R.layout.fragment1_main, null);	// inflater.inflateでR.layout.fragment1_mainからビューを作成.
		EditText fragmentEdittext1 = (EditText)view.findViewById(R.id.fragmentedittext1);	// fragmentEdittext1を取得.
		Log.d(TAG, "fragmentEdittext1 = " + fragmentEdittext1.getText().toString());	// fragmentEdittext1をログ出力.
		return view;	// viewを返す.
		
	}
	
	// アクティビティ生成完了時
	@Override
	public void onActivityCreated(Bundle savedInstanceState){
		
		// ログを残す.
		Log.d(TAG, "Fragment1.onActivityCreated");	// "Fragment1.onActivityCreated"とログに残す.
				
		// 既定の処理.
		super.onActivityCreated(savedInstanceState);
		
		// MainActivityのEditTextの内容を取得.
		MainActivity mainActivity = (MainActivity)getActivity();	// mainActivityを取得.
		EditText activityEdittext1 = (EditText)mainActivity.findViewById(R.id.activityedittext1);	// activityEdittext1を取得.
		Log.d(TAG, "onActivityCreated#activityEdittext1 = " + activityEdittext1.getText().toString());	// activityEdittext1をログ出力.
		Log.d(TAG, "mainActivity.mStr = " + mainActivity.mStr);	// mainActivity.mStrを出力.
		
	}
	
}

mStrをonCreateViewとonActivityCreatedで出力する。
onCreateViewの時点では完了してなさそうなので"AAA"、onActivityCreatedはMainActivity.onCreateの後なので"BBB"となりそうなものである。

ここから
ここから

ここから、

回転
回転

回転。

どちらもBBBになってしまう
どちらもBBBになってしまう

しかし、どちらもBBBになってしまう。
実は、コードによるFragment投入では、Fragment.onCreateViewはActivity.onCreateの後になってしまう。
なので、

XMLでfragmentを定義。
このままだと落ちるので、Fragment1.javaで、

こうする。
onCreateViewの時点では、ActivityのView生成が完了していないので、nullチェック。
onActivityCreatedとかも一応。

Button押さなくてもFragmentは追加される
Button押さなくてもFragmentは追加される

Button押さなくてもFragmentは追加される。

回転させると
回転させると

回転させると、

onCreateViewでAAA、onActivityCreatedでBBBとなる。
onCreateViewでAAA、onActivityCreatedでBBBとなる。

onCreateViewでAAA、onActivityCreatedでBBBとなる。
コードとXMLで順番が変わるので要注意。
とはいえ、onActivityCreatedの意味はなんとなくわかった。

Sample/android/Fragment/onActivityCreated/src/Fragment at master · bg1bgst333/Sample · GitHub