Barra de ferramentas do Android Adicionando itens de menu para fragmentos diferentes

87

Eu tenho uma barra de ferramentas e também uma gaveta de navegação. Quando eu inicio meu aplicativo, a barra de ferramentas e a gaveta de navegação são criadas. Quando eu clico em itens na gaveta de navegação, ele inicia novos fragmentos e mantém a mesma barra de ferramentas. Como eu basicamente adiciono itens de menu à barra de ferramentas, como pesquisar, adicionar, editar quando eu inicio fragmentos específicos? Não os quero no início do programa, mas sim criados dinamicamente. Além disso, como seria capaz de clicar nesses botões e fazer com que iniciem outros fragmentos. Eu quero isso em um fragmento, o botão de edição na barra de ferramentas faz uma coisa específica em comparação com o botão de edição em outro fragmento. Obrigado!

Menu_toolbar:

<?xml version="1.0" encoding="utf-8"?>
<menu
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">

<item android:id="@+id/edit"
    android:orderInCategory="1"
    android:title="Edit"
    app:showAsAction="always"
    android:icon="@drawable/pencil_icon"/>
<item android:id="@+id/add"
    android:orderInCategory="1"
    android:title="Add"
    app:showAsAction="always"
    android:icon="@drawable/plus_icon"/>

Barra de ferramentas:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="55dp"
android:background="#10a1ff"
android:title="Home"
/>
Joe Eigi
fonte

Respostas:

164

Adicione um código semelhante aos seus fragmentos:

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


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

Desta forma, você pode personalizar o menu para seus fragmentos.

Gundu Bandgar
fonte
19
Esta é a resposta correta porque a chamada para setHasOptionsMenu (true) é necessária para o método onCreateOptionsMenu sendo chamado no fragmento.
John Slavick
15
Lembre-se sobre a chamada menu.clear()em onCreateOptionsMenu- caso contrário você vai herdar o menu do pai, também.
Dart Dega
@DartDega onde coloco o código para limpar? Fragmento ou Atividade, senhor, não estou vendo o item de menu no meu fragmento
famfamfam
Isso funciona com a API de nível 28? Ainda vejo os itens do menu de atividades principais
ArdenDev
33

Veja como criar o menu dinamicamente: http://www.101apps.co.za/index.php/articles/using-toolbars-in-your-apps.html

Editado:

Toolbar actionBarToolBar = (Toolbar) findViewById(R.id.my_toobar);
setSupportActionBar(actionBarToolBar);
actionBarToolBar.setNavigationIcon(R.drawable.icon);
actionBarToolBar.setNavigationContextDescription(getResources().getString(R.string.desc);
actionBarToolBar.setLogo(R.drawable.other_icon);
actionBarToolBar.setLogoDescription(getResources().getString(R.string.other_desc);
actionBarToolBar.inflateMenu(R.menu.fragment_menu);
Allen Chan
fonte
4
use actionBarToolbar.setOnMenuItemClickListener()para controlar as ações dos itens de menu. onOptionsItemSelected()não é chamado nesta situação.
Lahiru Chandima de
2
O link fornecido não existe mais
Ashvin solanki
24

A melhor maneira de fazer isso:

1. Encontre a barra de ferramentas em Activity e defina-a como supportActionBar.

Toolbar actionBarToolBar = (Toolbar) findViewById(R.id.my_toobar);
setSupportActionBar(actionBarToolBar);

2. Em seguida, será muito fácil lidar com menus de opções para diferentes fragmentos em uma mesma atividade. Faça o seguinte em cada fragmento como desejar:

Na chamada do método OnCreateView

setHasOptionsMenu(true);

E por fim,

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

E para gerenciar os itens de menu, clique, temos onOptionsItemSelected:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.action_search :
            Log.i("item id ", item.getItemId() + "");
        default:
            return super.onOptionsItemSelected(item);
    }
}
Prateek Gupta
fonte
1
setHasOptionsMenu (true) é realmente útil! Obrigado
J.Dragon
10

Substitua o onCreateOptionsMenumétodo em cada fragmento.

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.your_menu_xml, menu);
    super.onCreateOptionsMenu(menu, inflater);
}
Ellie Zou
fonte
@JoeEigi Por que você quer uma barra de ferramentas diferente? Você pode definir títulos e menus diferentes.
Ellie Zou
@JoeEigi sim, você pode ter um menu personalizado inflando o xml do menu personalizado. A chamada setTitle()pode adicionar títulos.
Ellie Zou
@JoeEigi Parece que você entendeu o contexto errado, dê uma olhada nisto: stackoverflow.com/questions/26998455/…
Allen Chan
1
Desativei a barra de ações em meu manifesto, mas ainda aparece no layout de atividades acima da barra de ferramentas. Como faço para me livrar disso
Joe Eigi
Sim, fiz isso e ainda aparece no meu layout, mas saiu de vista
Joe Eigi
8

A opção mais simples é fazer

toolbar.inflateMenu(R.menu.fragment_menu);
Guillaume
fonte
4

Eu resolvi esses problemas corretamente. Minha solução é o seguinte código:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    mRootView = inflater.inflate(R.layout.fragment_order_history, container, false);
    //getActivity().invalidateOptionsMenu();


    setHasOptionsMenu(true);

    return mRootView;
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.main, menu);
    super.onCreateOptionsMenu(menu, inflater);
}
Hai Rom
fonte
Sim, mostrei o menu corretamente. Mas como ocultar este menu ao fechar o fragmento, quero dizer, quando mudamos para outro fragmento, por exemplo, de a -> b, o menu de a ainda visível na barra de ferramentas do fragmento b.
Zeeshan Ahmed
use setHasOptionsMenu (false) em onCreateView do fragmento b.
Kannan_SJD
4

Eu tive o mesmo problema e queria substituir o menu da barra de ferramentas de acordo com o fragmento exibido.

O problema que estou enfrentando agora é que o menu foi adicionado ao anterior.

Para mostrar apenas o menu do fragmento, sugiro:

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
     menu.clear(); //Empty the old menu
     inflater.inflate(R.menu.menu_fragment1, menu);
     super.onCreateOptionsMenu(menu, inflater);
}

Espero que ajude.

Matteo Gariglio
fonte
2
apenas verifique se menu! = null antes de chamar .clear ()
mapo
2

Abaixo estão as etapas para mostrar diferentes opções de menu com diferentes fragmentos.

Etapa 1: chame setHasOptionsMenu (true)

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        setHasOptionsMenu(true)
        super.onViewCreated(view, savedInstanceState)

    }

Passo 2: Inflar seus itens de menu de opções relacionados ao fragmento.

override fun onCreateOptionsMenu(menu: Menu?, inflater: MenuInflater?) {
    // To clear previously added menu items
    menu?.clear()
    inflater?.inflate(R.menu.your_fragment_menu, menu)
    super.onCreateOptionsMenu(menu, inflater)
}
Takharsh
fonte
Isso me ajudou a remover o botão de menu indesejado que apareceu no meu novo menu
Im Batman
1

Dentro do XML adicione esta linha

app:menu="@menu/main_menu"
Mohamed AbdelraZek
fonte
1
Na verdade você está certo! Você pode especificá-lo por xml e, em seguida, no fragmento: `` `override fun onViewCreated (view: View, savedInstanceState: Bundle?) {Super.onViewCreated (view, savedInstanceState) toolBar.setNavigationOnClickListener {activity? .OnBackPressed ()} searchView = toolBar.menu.findItem (R.id.action_search) .actionView como SearchView searchView.setOnQueryTextListener (this)} `` `
user3193413
0

Usando o novo MaterialToolbar , é muito fácil criar um menu flutuante e usá-lo para:

<com.google.android.material.appbar.MaterialToolbar
        android:id="@+id/toolbar"
        android:layout_width="0dp"
        android:layout_height="?attr/actionBarSize"
        app:navigationIcon="@drawable/ic_menu"
        app:menu="@menu/main_menu"/>

e, em seguida, no código para definir os Ouvintes OnCLick, basta adicionar isto:

toolbar.setOnMenuItemClickListener {
            // .. DO SOMETHING HERE
            false
        }
Amin Keshavarzian
fonte