フラグメント内のonCreateOptionsMenu


182

setHasOptionsMenu(true)内部onCreateViewに配置しましたが、onCreateOptionsMenuフラグメントの内部を呼び出すことはできません。

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
                         Bundle savedInstanceState) {   
   setHasOptionsMenu(true);             
   return inflater.inflate(R.layout.facesheet, container, false);
}

以下は私のonCreateOptionsMenuコードです。

@Override
public boolean onCreateOptionsMenu(com.actionbarsherlock.view.Menu menu) {
    getSupportMenuInflater().inflate(R.menu.layout, menu);
    return (super.onCreateOptionsMenu(menu));
}

私が得るエラーメッセージ:

onCreateOptionsMenu(Menu)タイプFragment のメソッドは、スーパータイプメソッドをオーバーライドまたは実装する必要があります。


1
「setHasOptionsMenu(true);」をありがとう、私はそれを探していました。
Fabricio PH 2014

回答:


497

これを試して、

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

そして、onCreateこの行を追加して、オプションをToolbar

setHasOptionsMenu(true);

182
この行を追加しないと呼び出されません:setHasOptionsMenu(true);
Yoann Hercouet '21 / 09/21

10
フラグメントのonCreateOptionsMenu()には、アクティビティとは異なる引数があります。
ホルヘ

3
また、上記のansで述べたように、アクティビティのonCreateOptionsMenu()のブール値とは異なり、voidとして別の戻り値の型。
デクスター2014年

4
興味深い注:含まれているアクティビティのonCreateOptionsMenuもオーバーライドすると、両方のオプションメニュー項目が表示されます。
Adam Johns、

5
setHasOptionsMenu(true);onCreate()完了するには、呼び出される必要があります。
Roel

21

action_settingsを定義する自動生成されたファイルres / menu / menu.xmlがすでにあります

あなたにMainActivity.java以下のメソッドがあります:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    switch (id) {
        case R.id.action_settings:
            // do stuff, like showing settings fragment
            return true;
    }

    return super.onOptionsItemSelected(item); // important line
}

ではonCreateView()、あなたのフラグメントの呼び出しの方法:

setHasOptionsMenu(true); 

また、次の2つのメソッドを追加します。

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

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    switch (id) {
        case R.id.action_1:
            // do stuff
            return true;

        case R.id.action_2:
            // do more stuff
            return true;
    }

    return false;
}

最後に、action_1action_2を定義する新しいファイルres / menu / fragment_menu.xmlを追加します。

このように、アプリがフラグメントを表示すると、そのメニューには3つのエントリが含まれます。

  • action_1からのres /メニュー/ fragment_menu.xml
  • action_2からのres /メニュー/ fragment_menu.xml
  • action_settingsからのres /メニュー/ menu.xml

1
問題は断片ではなく、断片の中にありました
OlivierM

2
@OlivierM答えはフラグメントメニューを説明しています。アクティビティメニューとの相互作用の説明に感謝しました。
アランダ2017年

13

@Alexander Farberと@Sino Rajの回答を試しました。どちらの答えもいいですが、欠けているものを見つけるまで、フラグメント内でonCreateOptionsMenuを使用できませんでした。

次のように、アクティビティにsetSupportActionBar(toolbar)を追加します。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.id.activity_main);

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
}

この答えが同じ問題を持つ人に役立つことを願っています。


4

コール

setSupportActionBar(toolbar)

内部

onViewCreated(...) 

破片の

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    Toolbar toolbar = (Toolbar) view.findViewById(R.id.toolbar);
    ((MainActivity)getActivity()).setSupportActionBar(toolbar);
    setHasOptionsMenu(true);
}

1
 @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.activity_add_customer, container, false);
        setHasOptionsMenu(true);
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.menu_sample, menu);
    super.onCreateOptionsMenu(menu,inflater);
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.