Implementei a biblioteca appcompat mais recente e usei a Toolbar
barra de ação como. Mas o problema é que não consigo capturar o evento de clique do botão home / ícone de hambúrguer. Eu tentei e olhei de tudo, mas não parece encontrar um problema semelhante.
Esta é a minha Activity
aula:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
// Set up the drawer.
navDrawerFragment =
(NavigationDrawerFragment) getSupportFragmentManager()
.findFragmentById(R.id.navigation_drawer);
navDrawerFragment.setUp(
R.id.navigation_drawer,
(DrawerLayout) findViewById(R.id.drawer_layout),
toolbar);
}
E esta é minha classe NavigationDrawerFragment:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
currentSelectedPosition = savedInstanceState.getInt(
STATE_SELECTED_POSITION);
fromSavedInstanceState = true;
}
// Select either the default item (0) or the last selected item.
selectItem(currentSelectedPosition);
}
@Override
public void onActivityCreated (Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
// Indicate that this fragment would like
// to influence the set of actions in the action bar.
setHasOptionsMenu(true);
}
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
drawerListView = (ListView) inflater.inflate(
R.layout.fragment_navigation_drawer, container, false);
drawerListView.setOnItemClickListener(
new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent,
View view, int position, long id) {
selectItem(position);
}
});
//mDrawerListView.setAdapter();
//mDrawerListView.setItemChecked(mCurrentSelectedPosition, true);
return drawerListView;
}
public void setUp(int fragmentId, DrawerLayout drawerLayout, Toolbar toolbar) {
fragmentContainerView = getActivity().findViewById(fragmentId);
this.drawerLayout = drawerLayout;
// set a custom shadow that overlays the main
// content when the drawer opens
drawerLayout.setDrawerShadow(
R.drawable.drawer_shadow, GravityCompat.START);
// set up the drawer's list view
// with items and click listener
ActionBar actionBar = getActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeButtonEnabled(true);
// ActionBarDrawerToggle ties together the the proper interactions
// between the navigation drawer and the action bar app icon.
drawerToggle = new ActionBarDrawerToggle(
getActivity(),
drawerLayout,
toolbar,
R.string.navigation_drawer_open,
R.string.navigation_drawer_close) {
public void onDrawerClosed(View view) {
super.onDrawerClosed(view);
}
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
}
};
// If the user hasn't 'learned' about the drawer,
// open it to introduce them to the drawer,
// per the navigation drawer design guidelines.
if (!userLearnedDrawer && !fromSavedInstanceState) {
drawerLayout.openDrawer(fragmentContainerView);
}
// Defer code dependent on restoration of previous instance state.
drawerLayout.post(new Runnable() {
@Override
public void run() {
drawerToggle.syncState();
}
});
drawerLayout.setDrawerListener(drawerToggle);
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(STATE_SELECTED_POSITION, currentSelectedPosition);
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Forward the new configuration the drawer toggle component.
drawerToggle.onConfigurationChanged(newConfig);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
Log.d("cek", "item selected");
if (drawerToggle.onOptionsItemSelected(item)) {
Log.d("cek", "home selected");
return true;
}
return super.onOptionsItemSelected(item);
}
quando clico em um item de menu, o log "item selecionado" é chamado. Mas quando clico no botão home, ele abre a gaveta de navegação, mas o registro "home selecionado" nunca é chamado. Eu também defini o onOptionsItemSelected
método dentro do meu Activity
, mas ele ainda não foi chamado.
fonte
no mycase este código funciona perfeitamente
fonte
É assim que eu faço para retornar ao fragmento correto, caso contrário, se você tiver vários fragmentos no mesmo nível, ele retornará ao primeiro se você não substituir o comportamento do botão Voltar da barra de ferramentas.
fonte
Acho que a solução correta com a biblioteca de suporte 21 é a seguinte
fonte
this.getResValues().homeIconDrawable()
, quem éthis
?e em cada
onViewCreated
eu ligofonte
Foi assim que implementei o design pré-material e parece que ainda funciona agora que mudei para o novo
Toolbar
. No meu caso, quero fazer o login do usuário se ele tentar abrir o nav lateral enquanto estiver desconectado (e capturar o evento para que o nav lateral não abra). No seu caso, você não poderiareturn true;
.fonte
Mudei um pouco o DrawerLayout para obter os eventos e poder consumir um evento, por exemplo, se você quiser usar o actionToggle como se estivesse na visualização de detalhes:
fonte
A abordagem mais fácil que poderíamos fazer é mudar o ícone inicial para um ícone conhecido e comparar drawables (porque o ícone android.R.id.home pode diferir para diferentes versões de API
então defina uma barra de ferramentas como actionbar SetSupportActionBar (_toolbar);
fonte
No meu caso tive que colocar o ícone usando:
E então ouça os eventos de clique com onOptionsItemSelected e id android.R.id.home padrão
fonte
android.R.id.home
nunca dispararPara quem procura uma implementação Xamarin (já que os eventos são feitos de maneira diferente em C #), simplesmente criei esta
NavClickHandler
classe da seguinte maneira:Em seguida, atribuiu um botão de menu de hambúrguer personalizado como este:
E, finalmente, atribuí ao alternador de menu da gaveta um ToolbarNavigationClickListener do tipo de classe que criei anteriormente:
E você tem um botão de menu personalizado, com eventos de clique gerenciados.
fonte
Tente este código
Adicione o código abaixo ao seu método onCreate ()
fonte