Fragment.onActivityCreatedは、Activityの生成が完了した時に呼ばれる。
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になってしまう。
実は、コードによるFragment投入では、Fragment.onCreateViewはActivity.onCreateの後になってしまう。
なので、
XMLでfragmentを定義。
このままだと落ちるので、Fragment1.javaで、
こうする。
onCreateViewの時点では、ActivityのView生成が完了していないので、nullチェック。
onActivityCreatedとかも一応。
Button押さなくてもFragmentは追加される。
回転させると、
onCreateViewでAAA、onActivityCreatedでBBBとなる。
コードとXMLで順番が変わるので要注意。
とはいえ、onActivityCreatedの意味はなんとなくわかった。
Sample/android/Fragment/onActivityCreated/src/Fragment at master · bg1bgst333/Sample · GitHub