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 no ToolbarWidgetWrapper
(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.