Estou tentando adicionar um item ao menu de opções de um grupo de fragmentos.
Eu criei uma nova MenuFragment
classe e estendi isso para os fragmentos nos quais desejo incluir o item de menu. Aqui está o código:
Java:
public class MenuFragment extends Fragment {
MenuItem fav;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
fav = menu.add("add");
fav.setIcon(R.drawable.btn_star_big_off);
}
}
Kotlin:
class MenuFragment : Fragment {
lateinit var fav: MenuItem
override fun onCreate(savedInstanceState: Bundle) {
super.onCreate(savedInstanceState)
setHasOptionsMenu(true)
}
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
fav = menu.add("add");
fav.setIcon(R.drawable.btn_star_big_off);
}
}
Por algum motivo, o onCreateOptionsMenu
parece não funcionar.
android
android-fragments
android-optionsmenu
misterbassman
fonte
fonte
Respostas:
Chame o super método:
Java:
Kotlin:
Coloque instruções de log no código para ver se o método não está sendo chamado ou se o menu não está sendo alterado pelo seu código.
Também garantir que você está chamando
setHasOptionsMenu(boolean)
emonCreate(Bundle)
notificar o fragmento que deveria participar na manipulação menu de opções.fonte
Eu tive o mesmo problema, mas acho melhor resumir e apresentar a última etapa para fazê-lo funcionar:
Adicione o método setHasOptionsMenu (true) ao método do seu fragmento
onCreate(Bundle savedInstanceState)
.Substituir
onCreateOptionsMenu(Menu menu, MenuInflater inflater)
(se você quiser fazer algo diferente no menu do seu Fragmento) eonOptionsItemSelected(MenuItem item)
métodos no seu Fragmento.Dentro
onOptionsItemSelected(MenuItem item)
do método da sua atividade, certifique-se de retornar falso quando a ação do item de menu for implementada noonOptionsItemSelected(MenuItem item)
método do fragmento.Um exemplo:
Atividade
Fragmento
fonte
setHasOptionsMenu(true);
GraçasSe você achar que o
onCreateOptionsMenu(Menu menu, MenuInflater inflater)
método não está sendo chamado, chame o seguinte noonCreate(Bundle savedInstanceState)
método do Fragment :fonte
Toolbar
e tive que chamarsetHasOptionsMenu(true)
emonCreateView()
vezonCreate()
de fazê-lo.Se você precisar
menu
atualizar umwebview
dentro de um específicoFragment
, poderá usar:Fragmento :
menu.xml
fonte
TL; DR
Use o
android.support.v7.widget.Toolbar
e apenas faça:Barra de ferramentas autônoma
A maioria das soluções sugeridas, como,
setHasOptionsMenu(true)
está funcionando apenas quando a Atividade pai tem a Barra de Ferramentas em seu layout e a declara viasetSupportActionBar()
. Em seguida, os fragmentos podem participar da população de menus dessa ActionBar exata :Se você deseja uma barra de ferramentas e menu independentes para um fragmento específico, faça o seguinte:
menu_custom_fragment.xml
custom_fragment.xml
CustomFragment.kt
Sim, é assim tão fácil. Você nem precisa substituir
onCreate()
ouonCreateOptionsMenu()
.PS: Isso está funcionando apenas com
android.support.v4.app.Fragment
eandroid.support.v7.widget.Toolbar
(também certifique-se de usarAppCompatActivity
e umAppCompat
tema no seustyles.xml
).fonte
No
menu.xml
você deve adicionar todos os itens de menu. Em seguida, você pode ocultar itens que não deseja ver no carregamento inicial.menu.xml
Adicione
setHasOptionsMenu(true)
o método onCreate () para chamar os itens de menu na sua classe Fragment.FragmentClass.java
Você não precisa substituir
onCreateOptionsMenu
sua classe Fragment novamente. Os itens de menu podem ser alterados (Adicionar / remover) substituindo oonPrepareOptionsMenu
método disponível no Fragmento.fonte
Você precisa usar menu.clear () antes de inflar os menus.
e
fonte
No meu caso, aqui estão os passos.
Passo 1
Passo 2
Etapa 3
fonte
menu.clear()
menu anterior limpo. Trabalhou para mim :)Se você deseja adicionar seu menu personalizado
fonte
Eu tive o mesmo problema, meus fragmentos eram páginas de um ViewPager. A razão pela qual isso estava acontecendo é que eu estava usando o gerenciador de fragmentos filho, em vez do gerenciador de fragmentos de suporte a atividades ao instanciar FragmentPagerAdapter.
fonte
Arquivo de menu:
Código da atividade:
Código do fragmento:
fonte
Seu código está bom. Apenas o super estava faltando no método:
fonte
Eu estava ficando louco porque nenhuma das respostas aqui funcionou para mim.
Para mostrar o menu, tive que ligar:
setSupportActionBar(toolbar)
Feito!
Nota: se sua
toolbar
visualização não estiver no mesmo layout de atividade, você não poderá usar a chamada acima diretamente da sua classe de atividade. Nesse caso, será necessário obter essa atividade da sua classe de fragmento e chamar osetSupportActionBar(toolbar)
. Lembrando: sua classe de atividade deve estender a AppCompatActivity.Espero que esta resposta o ajude.
fonte
Definir o menu de opções após criar a exibição de fragmento funcionou bem para mim.
fonte
Meu problema era um pouco diferente. Eu fiz tudo certo. Mas estava herdando a classe errada para a atividade que hospedava o fragmento.
Portanto, para ficar claro, se você estiver substituindo
onCreateOptionsMenu(Menu menu, MenuInflater inflater)
o fragmento, verifique se a classe de atividade que hospeda esse fragmento é herdadaandroid.support.v7.app.ActionBarActivity
(caso você queira oferecer suporte abaixo do nível 11 da API).Eu estava herdando o
android.support.v4.app.FragmentActivity
nível da API de suporte abaixo de 11.fonte
Uma coisa que eu acrescentaria a isso e a razão de não estar funcionando para mim.
É semelhante à resposta do Napster.
Verifique se a atividade de hospedagem do seu fragmento se estende
AppCompatActivity
, nãoFragmentActivity
!Na documentação de referência do Google para FragmentActivity:
Para atualizar a resposta do Napster -
ActionBarActivity
agora sendo preterida, use em seuAppCompatActivity
lugar.Ao usar
AppCompatActivity
, também defina "o tema da atividade comoTheme.AppCompat
ou um tema semelhante" (Google Doc).Nota:
android.support.v7.app.AppCompatActivity
é uma subclasse daandroid.support.v4.app.FragmentActivity
classe (consulte AppCompatActivity ref doc).fonte
Na pasta do menu, crie um arquivo .menu xml e adicione este xml
Na sua classe de fragmento, substitua esse método e
Agora basta configurar o arquivo xml do menu na classe de fragmento
fonte
Se todas as opções acima não funcionarem, é necessário depurar e certificar-se de que a função onCreateOptionsMenu tenha sido chamada (colocando o registro de depuração ou gravação ...)
Se não for executado, talvez o seu tema Android não seja compatível com a barra de ação. Abra AndroidManifest.xml e defina o valor para
android:theme
com a barra de ação de suporte ao tema :fonte
no seu método onCreate , adicione setHasOptionMenu ()
Em seguida, substitua seu onCreateOptionsMenu
fonte