6

何らかの理由で、アプリでonCreateOptionsMenu()AFTER が呼び出さonResume()れます...したがって、UI を設定している間 (onCreate()との間onResume())、メニューを把握できず、対応するアクションを設定できません。私のActionBarのアイテム...

これまでに見つけた唯一の回避策は、戻るinvalidateOptionsMenu()直前に手動で呼び出すことです。onCreate()その方法onCreateOptionsMenu()がすぐに呼び出され、メニューを手に入れて、最終的に目的のアクション アイテムを追加できます。

誰もこの問題を経験しましたか? 与えられたアクションアイテムonCreateOptionsMenu()が後に呼び出されるようにプログラムで設定するにはどうすればよいonResume()ですか?

私のアプリは JellyBean で実行されており、組み込みの ActionBar (ActionBarSherlock なし) を使用していますandroid:minSdkVersion="14"android:targetSdkVersion="16"

4

1 に答える 1

6

まず、おそらくこれを行うべきではないことを考慮してください。あなたのアイデアは、Android の典型的なデザイン パターンに反するように思えます。たとえば、ユーザーの選択に応じてメニューが変化する場合は、代わりにコンテキスト アクション モードを使用する必要があります。

  • アクションバー API ガイドから:

    原則として、オプション メニューのすべてのアイテム (アクション アイテムはもちろん) は、インターフェイスのごく一部だけに影響を与えるのではなく、アプリ全体に影響を与える必要があります。[...] したがって、メニュー項目をアクション項目として表示するかどうかを決定する前であっても、その項目が現在のアクティビティに対してグローバル スコープを持っていることを確認してください。

  • メニュー API ガイドから:

    View現在フォーカスされているものに基づいて、オプション メニューの項目を変更しないでください。タッチ モードの場合 (ユーザーがトラックボールや方向パッドを使用していない場合)、ビューはフォーカスを取得できないため、オプション メニューの項目を変更するためのベースとしてフォーカスを使用しないでください。に状況依存のメニュー項目を提供する場合は、 Context MenuViewを使用します。


ただし、説明したようにメニュー項目を変更したい場合は、 で変更するonPrepareOptionsMenu()必要があります。メニュー項目の変更が必要なイベントが発生したら、関連情報をフィールドに入れて を呼び出しますinvalidateOptionsMenu()。フィールドの値を上書きonPrepareOptionsMenu()して確認し、追加/削除するメニュー項目を決定します。

(このアプローチは推奨されませんが、どのメニュー項目を表示するかを変更するために呼び出しinvalidateOptionsMenu()てオーバーライドすることもできます。)onCreateOptionsMenu()

メニュー API ガイドからの詳細:

onCreateOptionsMenu()メニューの初期状態を作成するためだけに使用し、アクティビティのライフサイクル中に変更を加えないでください。アクティビティのライフサイクル中に発生するイベントに基づいてオプション メニューを変更する場合は、メソッドで行うことができます onPrepareOptionsMenu()

このメソッドは、Menu現在存在するオブジェクトを渡すので、項目の追加、削除、または無効化などの変更を行うことができます。(フラグメントもonPrepareOptionsMenu()コールバックを提供します。)

  • Android 2.3.x 以前ではonPrepareOptionsMenu() 、ユーザーがオプション メニューを開く (メニュー ボタンを押す) たびにシステムが呼び出します。

  • Android 3.0 以降では、アクション バーにメニュー項目が表示されている場合、オプション メニューは常に開いていると見なされます。イベントが発生し、メニューの更新を実行したい場合は、 を呼び出し invalidateOptionsMenu()てシステム コールを要求 する必要がありますonPrepareOptionsMenu()

于 2012-09-21T13:51:09.920 に答える