onCreateOptionsMenu dentro de fragmentos


182

Coloquei setHasOptionsMenu(true)dentro onCreateView, mas ainda não consigo chamar onCreateOptionsMenufragmentos dentro.

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

Abaixo está o meu onCreateOptionsMenucódigo.

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

A mensagem de erro que recebo:

O método onCreateOptionsMenu(Menu)do tipo Fragment deve substituir ou implementar um método de supertipo.


1
Obrigado pelo 'setHasOptionsMenu (true);', eu estava procurando por isso.
Fabricio PH

Respostas:


497

tente isso,

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

E onCreateadicione esta linha para fazer as opções aparecerem no seuToolbar

setHasOptionsMenu(true);

182
não será chamado se você não adicionar esta linha:setHasOptionsMenu(true);
Yoann Hercouet 21/09

10
onCreateOptionsMenu () para fragmentos possui argumentos diferentes dos de Atividades.
23413 Jorge Jorge

3
e também um tipo de retorno diferente como nulo, ao contrário do booleano de onCreateOptionsMenu () na atividade, conforme mencionado acima e ans.
Dexter

4
Nota interessante: se você também substituir o menu CreateCreateOptions na atividade que o contém, os dois itens do menu de opções serão exibidos.
Adam Johns

5
setHasOptionsMenu(true);precisa ser chamado onCreate()para ser concluído.
Roel

21

Você já tem o arquivo gerado automaticamente res / menu / menu.xml definindo action_settings .

No seu MainActivity.java, tenha os seguintes métodos:

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

No onCreateView()método da sua chamada de fragmento:

setHasOptionsMenu(true); 

e também adicione estes 2 métodos:

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

Por fim, adicione o novo arquivo res / menu / fragment_menu.xml que define action_1 e action_2 .

Dessa forma, quando o aplicativo exibir o fragmento, o menu conterá 3 entradas:

  • action_1 de res / menu / fragment_menu.xml
  • action_2 de res / menu / fragment_menu.xml
  • action_settings de res / menu / menu.xml

1
a questão foi fragmentos para dentro, não actividade
OlivierM

2
@OlivierM a resposta explica o menu de fragmentos. Apreciei a explicação de como ele interage com o menu de atividades.
Aranda

13

Tentei as respostas @Alexander Farber e @Sino Raj. Ambas as respostas são boas, mas não pude usar o onCreateOptionsMenu dentro do meu fragmento, até descobrir o que estava faltando:

Adicione setSupportActionBar (barra de ferramentas) em minha Atividade, assim:

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

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

Espero que esta resposta possa ser útil para alguém com o mesmo problema.


4

Ligar

setSupportActionBar(toolbar)

dentro

onViewCreated(...) 

de fragmento

@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);
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.