Ao usar a Gaveta de Navegação, os desenvolvedores do Android recomendam que na ActionBar "apenas as telas representadas na Gaveta de Navegação tenham realmente a imagem da Gaveta de Navegação" e que "todas as outras telas tenham o tradicional quilate".
Veja aqui para detalhes: http://youtu.be/F5COhlbpIbY
Estou usando uma atividade para controlar vários níveis de fragmentos e posso fazer com que a imagem da Gaveta de Navegação seja exibida e funcione em todos os níveis.
Ao criar fragmentos de nível inferior, posso chamar o ActionBarDrawerToggle
setDrawerIndicatorEnabled(false)
para ocultar a imagem da Gaveta de Navegação e exibir o cursor para cima
LowerLevelFragment lowFrag = new LowerLevelFragment();
//disable the toggle menu and show up carat
theDrawerToggle.setDrawerIndicatorEnabled(false);
getSupportFragmentManager().beginTransaction().replace(R.id.frag_layout,
lowFrag, "lowerFrag").addToBackStack(null).commit();
O problema que estou tendo é quando navego de volta aos fragmentos de nível superior que o quilate Up ainda mostra em vez da imagem original da gaveta de navegação. Alguma sugestão sobre como "atualizar" a ActionBar nos fragmentos de nível superior para exibir novamente a imagem da Gaveta de Navegação?
Solução
A sugestão de Tom funcionou para mim. Aqui está o que eu fiz:
Atividade principal
Esta atividade controla todos os fragmentos no aplicativo.
Ao preparar novos fragmentos para substituir outros, defino o DrawerToggle setDrawerIndicatorEnabled(false)
assim:
LowerLevelFragment lowFrag = new LowerLevelFragment();
//disable the toggle menu and show up carat
theDrawerToggle.setDrawerIndicatorEnabled(false);
getSupportFragmentManager().beginTransaction().replace(R.id.frag_layout,
lowFrag).addToBackStack(null).commit();
Em seguida, em uma substituição de onBackPressed
, eu reverti o acima, definindo o DrawerToggle da setDrawerIndicatorEnabled(true)
seguinte maneira:
@Override
public void onBackPressed() {
super.onBackPressed();
// turn on the Navigation Drawer image;
// this is called in the LowerLevelFragments
setDrawerIndicatorEnabled(true)
}
Nos LowerLevelFragments
Nos fragmentos eu modifiquei onCreate
e onOptionsItemSelected
assim:
Na onCreate
adicionado setHasOptionsMenu(true)
para permitir configurar o menu de opções. Defina também setDisplayHomeAsUpEnabled(true)
para ativar o < na barra de ação:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// needed to indicate that the fragment would
// like to add items to the Options Menu
setHasOptionsMenu(true);
// update the actionbar to show the up carat/affordance
getActivity().getActionBar().setDisplayHomeAsUpEnabled(true);
}
Em seguida, onOptionsItemSelected
sempre que o < é pressionado, ele chama o onBackPressed()
da atividade para subir um nível na hierarquia e exibir a Imagem da gaveta de navegação:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Get item selected and deal with it
switch (item.getItemId()) {
case android.R.id.home:
//called when the up affordance/carat in actionbar is pressed
getActivity().onBackPressed();
return true;
…
}
.replace(R.id.frag_layout
. Se este é mais um nível de hierarquia, eu esperaria que você.add
o recuasse.theDrawerToggle.setDrawerIndicatorEnabled(false);
interior do fragmento? Eu acho que é declarado no arquivo de classe da atividade principal. Não consigo encontrar uma maneira de fazer referência a isso. Alguma dica?setDisplayOptions()
método noToolbarWidgetWrapper
(do pacote android.support.v7.internal.widget interno) não recriaria o ícone ao inserir o mesmo fragmento pela segunda vez. Apenas deixando isso aqui para quando outros tropeçarem nesse problema também.Respostas:
Você escreveu que, para implementar fragmentos de nível inferior, você está substituindo o fragmento existente, em vez de implementar o fragmento de nível inferior em uma nova atividade.
Eu pensaria que você teria que implementar a funcionalidade back manualmente: quando o usuário pressionou, você tem um código que abre a pilha (por exemplo,
Activity::onBackPressed
sobrescreva). Então, onde quer que você faça isso, você pode reverter osetDrawerIndicatorEnabled
.fonte
É fácil como 1-2-3.
Se você deseja alcançar:
1) Indicador da gaveta - quando não há fragmentos na pilha traseira ou a gaveta é aberta
2) Seta - quando alguns fragmentos estão na pilha de trás
3) Ambos os indicadores para agir de acordo com sua forma
PS Consulte Criando uma gaveta de navegação no Android Developers para obter outras dicas sobre o comportamento do indicador de três linhas.
fonte
setActionBarArrowDependingOnFragmentsBackStack()
... que nome longo: PEu usei a próxima coisa:
fonte
drawerToggle.setToolbarNavigationClickListener(
esse ouvinte é chamado quando se clica na setaSe o botão da barra de ação para cima não funcionar, não se esqueça de adicionar o ouvinte:
Estou com problemas para implementar uma navegação na gaveta com um botão home, tudo funcionou, exceto o botão de ação.
fonte
Tente manipular a seleção do item Home na MainActivity, dependendo do estado do DrawerToggle. Dessa forma, você não precisa adicionar o mesmo código a cada fragmento.
fonte
onBackPressed()
porque queria o mesmo comportamento para ambos.ACOMPANHAMENTO
A solução dada por @dzeikei é pura, mas pode ser estendida, ao usar fragmentos, para lidar automaticamente com a reposição do indicador da gaveta quando a barra de apoio está vazia.
EDITAR
Para a pergunta de @JJD.
Os fragmentos são mantidos / gerenciados em uma atividade. O código acima é gravado uma vez nessa atividade, mas apenas manipula o cursor para o
onOptionsItemSelected
.Em um dos meus aplicativos, eu também precisava lidar com o comportamento do cursor quando o botão Voltar foi pressionado. Isso pode ser resolvido sobrescrevendo
onBackPressed
.Observe a duplicação de código entre
onOptionsItemSelected
eonBackPressed
que pode ser evitada criando um método e chamando esse método nos dois locais.Observe também que eu adiciono mais duas vezes, o
executePendingTransactions
que, no meu caso, era necessário ou, às vezes, eu tinha comportamentos estranhos com o sinal de intercalação.fonte
mDrawerToggle
dentro de umaNavigationDrawerFragment
classe. Para fazê-lo funcionar eu preciso também alternar o estado do botão home / indicador - veja:NavigationDrawerFragment#toggleDrawerIndicator
. Além disso, não tenho certeza de que você precise do check-in inicialonOptionsItemSelected
: descomentei-o. - Exemplo simplificadoonOptionsItemSelected
. Isso garante que a gaveta de navegação ainda seja aberta na hierarquia de nível superior. No entanto, mudei o código para o arquivoNavigationDrawerFragment#onOptionsItemSelected
. Isso me ajuda a não expormDrawerToggle
aoMainActivity
.Criei uma interface para a atividade de hospedagem para atualizar o estado de exibição do menu de hambúrguer. Para fragmentos de nível superior, defino a alternância para
true
e para os fragmentos para os quais quero exibir a seta para cima <Defino a alternância parafalse
.Então na minha atividade ...
fonte
Esta resposta estava funcionando, mas havia um pequeno problema. Não
getSupportActionBar().setDisplayHomeAsUpEnabled(false)
foi chamado explicitamente e estava ocultando o ícone da gaveta, mesmo quando não havia itens no backstack, portanto, alterar osetActionBarArrowDependingOnFragmentsBackStack()
método funcionou para mim.fonte
A lógica é clara. Mostrar o botão Voltar se a pilha traseira do fragmento estiver limpa. Mostrar animação de retorno de hambúrguer de material se a pilha de fragmentos não estiver clara.
fonte
Se você der uma olhada no aplicativo GMAIL e vier aqui, procure o ícone de custo / benefício.
Eu pediria que você fizesse isso, nenhuma das respostas acima foi clara. Consegui modificar a resposta aceita.
NavigationDrawer -> Listview contém subfragmentos.
subfragmentos serão listados assim
firstFragment == posição 0 ---> isso terá subfragmentos -> fragmento
No firstFragment você tem outro fragmento.
Chame isso em DrawerActivity
e em fragmento
No método de atividade OnBackPressed Drawer, defina a alternância da gaveta para true para ativar o ícone da lista de navegação novamente.
Obrigado, Pusp
fonte
Você pode ver este pequeno exemplo! https://github.com/oskarko/NavDrawerExample
fonte
O IMO, usando onNavigateUp () (como mostrado aqui ) na solução de riwnodennyk ou Tom, é mais limpo e parece funcionar melhor. Apenas substitua o código onOptionsItemSelected por este:
fonte