web-dev-qa-db-ja.com

フラグメント内のonCreateOptionsMenu

onCreateView内にsetHasOptionsMenu(true)を配置しましたが、フラグメント内で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));
}

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

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

153
Kevin

これを試して、

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

onCreateにこの行を追加して、オプションをToolbarに表示します

setHasOptionsMenu(true);
438
Sino Raj

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

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
}

Fragment呼び出しの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;
}

最後に、新しいファイルを追加しますres/menu/fragment_menu.xml定義action_1およびaction_2

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

  • action_1 from res/menu/fragment_menu.xml
  • action_2 from res/menu/fragment_menu.xml
  • action_settings from res/menu/menu.xml
20

@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);
}

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

コール

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);
}
2
Chanh
 @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);
}
1
Keshav Gera