2013-05-12 19 views
11

私はフラグメントの開始時に変化するオプションメニューを持つ簡単なアプリケーションを持っています。 問題は、最初にonCreateOptionsMenu()を除くフラグメントがonCreate()内とonResume()の後で2回呼び出されることです。 onCreate()では、setHasOptionsMenu(true)を使用して手動で呼び出しますが、onResume()の後は発生しません。 これは、最初のフラグメントが開始された後にのみ発生します。ここでonCreateOptionsMenu()はフラグメント内で2回呼び出されました

は、ベース断片コードです:

class BaseFragment extends Fragment { 

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

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle clicks 
     return true; 
    } 

    @Override 
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
     // Create a menu 
     super.onCreateOptionsMenu(menu, inflater); 
    } 
} 

と活動における変更の断片コード:

public void startFragment(BaseFragment fragment) { 
    getSupportFragmentManager() 
    .beginTransaction() 
    .replace(android.R.id.content, fragment) 
    .commit(); 
} 

サンプルはActionBarSherlock、唯一SupportLibraryなどの任意の外部ライブラリを使用していません。 問題はFragmentTransaction replace()メソッドにあります。なぜなら、最初のフラグメントが開始されたときに問題なく動作するからです。しかし、私は、どこで問題を解決し始めるのか分かりません。私は正確にビューでフラグメントを置き換える必要があります。

+0

どの携帯電話を使用していますか?電話機に専用のメニューボタンがある場合、onCreateOptionsMenuは、ユーザがそれをクリックしたときにのみ呼び出されます。 add-onには、setHasOptionsMenu(true)がonCreateOptionsMenuを呼び出す必要はありません。これは、フレームワークに、メニューにポピュレートするときにフラグメントが参加したいと通知するだけです。 – prijupaul

+0

OPでも同じ問題があるときに質問を追加/編集することはできません。私はMenuについての基本的なものを知っています、問題は説明されたOPのような奇妙です。 編集:私はネストされたフラグメントを使用しています – Zyoo

+0

@prijupaulそれは実際にハニカム前のバージョンのためだけです。 Honeycombでは、setHasOptionsMenu()を呼び出した直後にonCreateOptionsMenuが呼び出されます。 – bvitaliyg

答えて

-1

メニュー項目を処理しない場合は、onOptionsItemSelected()のスーパークラス実装を呼び出す必要があります(デフォルト実装はfalseを返します)。

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    return super.onOptionsItemSelected(item); 
} 
+0

なぜダウン投票???それは何が間違っている。 –

+0

私は、onCreateOptionsMenuを使って質問することをお勧めします。答えはonCreateOptionMenuとlifecycleでは適切ではないonResumeを使用することです。 – prijupaul

+0

手動では呼び出されません。 setHasOptionsMenu(true)が呼び出されると、フラグメントにメニューがあることをフレームワークに通知します。フレームワークは、必要に応じて、必要な機能を呼び出します。これがtrueに設定されていない場合、フレームワークはフラグメントでoncreateoptionsmenuを呼び出しません。 – prijupaul

2

新たにフラグメントを追加すると、onCreateOptionsMenuのアクティビティが再度呼び出されるようです。

1>

setRetainInstance(true)を追加してみてください。

とフラグメントコンストラクタ!

public BaseFragment() 
{ 
    setRetainInstance(true); 
    setHasOptionsMenu(true); 
} 

この問題は、アクティビティが破壊されたときにAndroidがフラグメントを破壊しないという事実に関連すると思わ回転

時の断片のそれぞれの個々の状態を保存/復元します(デバイスは回転します)。

私はこれを見つけたここJake Wharton SO

更新中: 2>もう一つの方法は、レイアウトファイルにフラグメントを追加することを避けるためにあり、また、コンストラクタ/ newInstanceメソッドを呼び出すことにより、手動でインスタンス化します。

レイアウトにフラグメントを追加すると、アンドロイドフレームワークがそれをインスタンス化します。 フラグメントを手動でインスタンス化する代わりに、FragmentManager.getFragmentByIdを呼び出してインスタンスを取得し、代わりにそのインスタンスを使用する必要があります。

だから常に

@Override 
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
      menu.clear(); 
      inflater.inflate(R.menu.call_menu, menu); 
      super.onCreateOptionsMenu(menu, inflater); 

    } 
+1

いいえ、私はそれが答えだとは思わない。もちろん、私はあなたが上で述べたことをすべて試しましたが、それでもテストするたびに発生します – Zyoo

+0

@Zyooはあなたの問題の解決策を他にも持っていますか? –

+0

申し訳ありませんが、私はoptionmenuを使用しないことに決めましたが、将来的には必要になると思いますので、まだ試しています – Zyoo

0

あなたは、おそらくこのようにそれを試みることができるmenu.clear()を呼び出すことによって

3>これで試してみてくださいあなたの破片のためのIDおよび/またはタグを含める:

private final int MENU_SEARCH=Menu.FIRST; 
: 
    @Override public void onPrepareOptionsMenu(Menu menu) { 
     if (menu.findItem(MENU_SEARCH)==null) { 
      menu.add(0, MENU_SEARCH, Menu.NONE, getText(R.string.menu_search)); 
: 

eメニュー項目の1つがメニューに存在するかどうかを確認し、そうでない場合はおそらくすべてを追加する必要があります。

7

私はパーティーに遅れています知っているが、同じissue-に走ったと私の解決策が明示的に私のSupportFragmentsのonCreate機能に

setHasOptionsMenu(false); 

を追加するために、実際にしました。これにより、アクティビティのonCreateOptionsMenuとonPrepareOptionsMenuへの余分なコールが防止されます。お役に立てれば。

2

問題を解決する最も簡単な方法は、膨らませる直前にメニューをクリアすることです。

menu.clear()は、既存のメニューをクリアし、新しいメニューから開始します。

@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
     super.onCreateOptionsMenu(menu, inflater); 
     menu.clear(); 
     inflater.inflate(R.menu.sample_menu, menu); 
}