public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
次のように、スーパーを呼び出さずにメソッドをオーバーライドするフラグメントがあります。
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.my_id, container, false);
return view;
}
このフラグメントは、アクティビティとカスタムDialogPreference
実装の両方で使用されます。フラグメントはアクティビティのレイアウト ファイルと<fragment>
タグ付きの設定に含まれandroid:id
、両方に属性があります (ただし、id はアクティビティ レイアウトと設定レイアウトで異なります)。
カスタム DialogPreference は PreferenceFragment 内で使用され、すべてが意図したとおりに機能します。PreferenceScreen でカスタム設定をクリックすると、onCreateView メソッドが呼び出され、Fragment を内部に含む DialogFragment が正しく表示されます。戻ると、ダイアログが閉じて、PreferenceScreen が再び表示されます。次のクリックで onCreateView が再度呼び出され、すべて正常に表示されます。
ここで説明したように、このフラグメントに「RetainedFragment」を追加して、いくつかの状態を保存しようとしています。これを実現するために、フラグメントの onCreate を次のように上書きしました。
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FragmentManager fm = getFragmentManager();
retainedFragment = (RetainedFragment) fm.findFragmentByTag("retained");
if(retainedFragment == null) {
retainedFragment = new RetainedFragment();
fm.beginTransaction().add(retainedFragment, "retained").commit();
}
}
これはActivityの場合には完全に機能しますが、現在、DialogPreferenceを2回続けて開こうとすると、アプリがクラッシュします
java.lang.IllegalStateException:
Fragment com.myapp.MyFragment did not create a view
いくつかのブレークポイントを設定しましたonCreateView
が、フラグメントのメソッドは、PreferenceScreen を開いた後に DialogPreference を初めてクリックしたときにのみ呼び出されるようです。間に PreferenceScreen を閉じると、問題なく動作します。
新しい「RetainedFragment」ではなく、最初の Fragment に対して例外が発生することは注目に値します。