4

このチュートリアルに基づいてレイアウトを実装しました:http://android-developers.blogspot.hu/2011/02/android-30-fragments-api.html

違いは次のとおりです。

  • 左側のリストの選択に基づいて、表示するフラグメントが異なります
  • 「詳細フラグメント」(右側にあるもの)には、さまざまなオプションメニューがあります

私の問題は、すでに左から何かを選択してから電話を縦向きに回転させた場合、最後のオプションメニューがまだそこにあり、表示されていることです。

問題は、向きの変更後に最後にアクティブな「詳細」フラグメントが再作成されたことに起因すると思います。それをテストするために、次の2つのメソッドを作成しました。

@Override
public void onStart() {
    super.onStart();
    setHasOptionsMenu(true);
}

@Override
public void onStop() {
    super.onStop();
    setHasOptionsMenu(false);
}

そして、私はこのような正しいフラグメントを示しています:

case R.id.prefs_medicines:
        if (mDualPane) {


            // Check what fragment is shown, replace if needed.
            View prefsFrame = getActivity().findViewById(R.id.preferences);
            if (prefsFrame != null) {
                // Make new fragment to show this selection.
                MedicineListF prefF = new MedicineListF();

                // Execute a transaction, replacing any existing
                // fragment with this one inside the frame.
                FragmentTransaction ft = getFragmentManager().beginTransaction();
                ft.replace(R.id.preferences, prefF);
                ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
                ft.commit();
            }

        } else {
            // Otherwise we need to launch a new activity to display
            // the dialog fragment with selected text.
            Intent intent = new Intent();
            intent.setClass(getActivity(), MedicinePrefsActivity.class);
            startActivity(intent);
        }
        break;

私の「詳細」フラグメントの1つにあります。デバッグしたところ、ローテーション後にonstartが呼び出されました。

写真の問題:

1:ランドスケープではOK ランドスケープモードhttp://img834.imageshack.us/img834/8918/error1d.png

2:ポートレートの場合:optionsmenuは不要 ポートレートモードhttp://img860.imageshack.us/img860/8636/error2r.png

ポートレートモードでオプションメニューを削除するにはどうすればよいですか?

4

1 に答える 1

5

私は同じ問題を抱えていましたが、savedInstanceState が null の場合にのみフラグメントに setHasOptionsMenu(true) を設定することで解決しました。onCreate がバンドルを取得した場合、フラグメントは向きが縦向きに変更されて復元されるため、メニューを表示しないでください。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if(savedInstanceState == null) {
        setHasOptionsMenu(true);
    }
}       
于 2012-10-07T11:17:59.507 に答える