1

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 に対して例外が発生することは注目に値します。

4

0 に答える 0