No se puede bloquear el evento de clic de botón de inicio de la barra de herramientas

He implementado la más nueva librería appcompat y usar la Toolbar como barra de acción. Pero el problema es que no puedo coger el botón de inicio / icono de hamburguesa haga clic en el evento. He intentado y miró todo, pero no parece encontrar un problema similar.

Esta es mi clase de Activity :

 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); } 

Y esta es mi clase de 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); } 

Cuando hice clic en un elemento de menú, el registro "elemento seleccionado" se llama. Pero cuando hago clic en el botón de inicio, se abre cajón de navegación, pero el registro "casa seleccionada" nunca se llama. He fijado el método onOptionsItemSelected dentro de mi Activity también, pero todavía no consigue llamado.

Si quieres saber cuándo se hace clic en el hogar es AppCompatActivity entonces deberías probarlo de la siguiente manera:

Primero dile a Android que quieres usar tu Toolbar como tu ActionBar :

 setSupportActionBar(toolbar); 

A continuación, establezca Home para que se muestre a través de setDisplayShowHomeEnabled esta manera:

 getSupportActionBar().setDisplayShowHomeEnabled(true); 

Finalmente, escuche los eventos de clic en android.R.id.home como de costumbre:

 @Override public boolean onOptionsItemSelected(MenuItem menuItem) { if (menuItem.getItemId() == android.R.id.home) { Timber.d("Home pressed"); } return super.onOptionsItemSelected(menuItem); } 

Si desea saber cuándo se hace clic en el botón de navegación en una Toolbar de Toolbar en una clase que no sea AppCompatActivity , puede utilizar estos métodos para establecer un icono de navegación y escuchar los eventos de clic en él. El icono de navegación aparecerá en el lado izquierdo de la Toolbar de Toolbar donde solía estar el botón "inicio".

 toolbar.setNavigationIcon(getResources().getDrawable(R.drawable.ic_nav_back)); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.d("cek", "home selected"); } }); 

Si desea saber cuándo se hace clic en la hamburguesa y cuando se abre el cajón, ya está escuchando estos eventos a través de onDrawerOpened y onDrawerClosed por lo que querrá ver si esas devoluciones responden a sus necesidades.

  mActionBarDrawerToggle = mNavigationDrawerFragment.getActionBarDrawerToggle(); mActionBarDrawerToggle.setToolbarNavigationClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // event when click home button } }); 

En mycase este código trabaja perfecto

Esto es cómo lo hago para volver al fragmento derecho de lo contrario si usted tiene varios fragmentos en el mismo nivel que volvería a la primera si no se anula el comportamiento del botón de la barra de herramientas de nuevo.

 toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { finish(); } }); 

Creo que la solución correcta con la biblioteca de soporte 21 es la siguiente

 // action_bar is def resource of appcompat; // if you have not provided your own toolbar I mean Toolbar toolbar = (Toolbar) findViewById(R.id.action_bar); if (toolbar != null) { // change home icon if you wish toolbar.setLogo(this.getResValues().homeIconDrawable()); toolbar.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //catch here title and home icon click } }); } 

He manejado atrás y botón de inicio en el cajón de navegación como

 public class HomeActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener { private ActionBarDrawerToggle drawerToggle; private DrawerLayout drawerLayout; NavigationView navigationView; private Context context; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_home); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); resetActionBar(); navigationView = (NavigationView) findViewById(R.id.navigation_view); navigationView.setNavigationItemSelectedListener(this); //showing first fragment on Start getSupportFragmentManager().beginTransaction().setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN).replace(R.id.content_fragment, new FirstFragment()).commit(); } @Override public boolean onOptionsItemSelected(MenuItem item) { //listener for home if(id==android.R.id.home) { if (getSupportFragmentManager().getBackStackEntryCount() > 0) onBackPressed(); else drawerLayout.openDrawer(navigationView); return true; } return super.onOptionsItemSelected(item); } @Override public void onBackPressed() { if (drawerLayout.isDrawerOpen(GravityCompat.START)) drawerLayout.closeDrawer(GravityCompat.START); else super.onBackPressed(); } @Override public boolean onNavigationItemSelected(MenuItem item) { // Begin the transaction Fragment fragment = null; // Handle navigation view item clicks here. int id = item.getItemId(); DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); if (id == R.id.nav_companies_list) { fragment = new FirstFragment(); // Handle the action } // Begin the transaction if(fragment!=null){ if(item.isChecked()){ if(getSupportFragmentManager().getBackStackEntryCount()==0){ drawer.closeDrawers(); }else{ removeAllFragments(); getSupportFragmentManager().beginTransaction().setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE).replace(R.id.WikiCompany, fragment).commit(); drawer.closeDrawer(GravityCompat.START); } }else{ removeAllFragments(); getSupportFragmentManager().beginTransaction().setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE).replace(R.id.WikiCompany, fragment).commit(); drawer.closeDrawer(GravityCompat.START); } } return true; } public void removeAllFragments(){ getSupportFragmentManager().popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); } public void replaceFragment(final Fragment fragment) { FragmentManager fragmentManager = getSupportFragmentManager(); fragmentManager.beginTransaction().setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN) .replace(R.id.WikiCompany, fragment).addToBackStack("") .commit(); } public void updateDrawerIcon() { final Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { try { Log.i("", "BackStackCount: " + getSupportFragmentManager().getBackStackEntryCount()); if (getSupportFragmentManager().getBackStackEntryCount() > 0) drawerToggle.setDrawerIndicatorEnabled(false); else drawerToggle.setDrawerIndicatorEnabled(true); } catch (Exception ex) { ex.printStackTrace(); } } }, 50); } public void resetActionBar() { //display home getSupportActionBar().setDisplayShowHomeEnabled(true); getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setHomeButtonEnabled(true); } public void setActionBarTitle(String title) { getSupportActionBar().setTitle(title); } } 

Y en cada onViewCreated llamo

 @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); ((HomeActivity)getActivity()).updateDrawerIcon(); ((HomeActivity) getActivity()).setActionBarTitle("List"); } 

He cambiado el DrawerLayout un poco para obtener los eventos y ser capaz de consumir y evento, como si desea utilizar el actionToggle como volver si está en la vista de detalle:

 public class ListenableDrawerLayout extends DrawerLayout { private OnToggleButtonClickedListener mOnToggleButtonClickedListener; private boolean mManualCall; public ListenableDrawerLayout(Context context) { super(context); } public ListenableDrawerLayout(Context context, AttributeSet attrs) { super(context, attrs); } public ListenableDrawerLayout(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } /** * Sets the listener for the toggle button * * @param mOnToggleButtonClickedListener */ public void setOnToggleButtonClickedListener(OnToggleButtonClickedListener mOnToggleButtonClickedListener) { this.mOnToggleButtonClickedListener = mOnToggleButtonClickedListener; } /** * Opens the navigation drawer manually from code<br> * <b>NOTE: </b>Use this function instead of the normal openDrawer method * * @param drawerView */ public void openDrawerManual(View drawerView) { mManualCall = true; openDrawer(drawerView); } /** * Closes the navigation drawer manually from code<br> * <b>NOTE: </b>Use this function instead of the normal closeDrawer method * * @param drawerView */ public void closeDrawerManual(View drawerView) { mManualCall = true; closeDrawer(drawerView); } @Override public void openDrawer(View drawerView) { // Check for listener and for not manual open if (!mManualCall && mOnToggleButtonClickedListener != null) { // Notify the listener and behave on its reaction if (mOnToggleButtonClickedListener.toggleOpenDrawer()) { return; } } // Manual call done mManualCall = false; // Let the drawer layout to its stuff super.openDrawer(drawerView); } @Override public void closeDrawer(View drawerView) { // Check for listener and for not manual close if (!mManualCall && mOnToggleButtonClickedListener != null) { // Notify the listener and behave on its reaction if (mOnToggleButtonClickedListener.toggleCloseDrawer()) { return; } } // Manual call done mManualCall = false; // Let the drawer layout to its stuff super.closeDrawer(drawerView); } /** * Interface for toggle button callbacks */ public static interface OnToggleButtonClickedListener { /** * The ActionBarDrawerToggle has been pressed in order to open the drawer * * @return true if we want to consume the event, false if we want the normal behaviour */ public boolean toggleOpenDrawer(); /** * The ActionBarDrawerToggle has been pressed in order to close the drawer * * @return true if we want to consume the event, false if we want the normal behaviour */ public boolean toggleCloseDrawer(); } } 

El enfoque más fácil que podemos hacer es cambiar el icono de inicio a un icono conocido y comparar drawables (porque el icono de android.R.id.home puede diferir de las diferentes versiones de api

Así que establece una barra de herramientas como barra de acción SetSupportActionBar (_toolbar);

 _toolbar.NavigationIcon = your_known_drawable_here; for (int i = 0; i < _toolbar.ChildCount; i++) { View v = _toolbar.GetChildAt(i); if (v is ImageButton) { ImageButton imageButton = v as ImageButton; if (imageButton.Drawable.GetConstantState().Equals(_bookMarkIcon.GetConstantState())) { //here v is the widget that contains the home icon you can add your click events here } } } 

En mi caso tuve que poner el icono usando:

 toolbar.setNavigationIcon(R.drawable.ic_my_home); setSupportActionBar(toolbar); getSupportActionBar().setDisplayShowHomeEnabled(true); getSupportActionBar().setHomeButtonEnabled(true); 

Y luego escuche los eventos de clic con el valor por defecto onOptionsItemSelected y android.R.id.home id

Para cualquiera que esté buscando una implementación de Xamarin (ya que los eventos se realizan de forma diferente en C #), simplemente creé esta clase NavClickHandler la siguiente manera:

 public class NavClickHandler : Java.Lang.Object, View.IOnClickListener { private Activity mActivity; public NavClickHandler(Activity activity) { this.mActivity = activity; } public void OnClick(View v) { DrawerLayout drawer = (DrawerLayout)mActivity.FindViewById(Resource.Id.drawer_layout); if (drawer.IsDrawerOpen(GravityCompat.Start)) { drawer.CloseDrawer(GravityCompat.Start); } else { drawer.OpenDrawer(GravityCompat.Start); } } } 

A continuación, asigna un botón de menú personalizado de hamburguesas como este:

  SupportActionBar.SetDisplayHomeAsUpEnabled(true); SupportActionBar.SetDefaultDisplayHomeAsUpEnabled(false); this.drawerToggle.DrawerIndicatorEnabled = false; this.drawerToggle.SetHomeAsUpIndicator(Resource.Drawable.MenuButton); 

Y finalmente, asignó el menú de los cajones toggler a ToolbarNavigationClickListener del tipo de clase que creé anteriormente:

  this.drawerToggle.ToolbarNavigationClickListener = new NavClickHandler(this); 

Y luego tienes un botón de menú personalizado, con los eventos de clic manejados.

Prueba este código

 @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if(id == android.R.id.home){ //You can get } return super.onOptionsItemSelected(item); } 

Añada el siguiente código a su método onCreate ()

 ActionBar ab = getSupportActionBar(); ab.setDisplayHomeAsUpEnabled(true); 

Así es como implementé el diseño de pre-material y parece que aún funciona ahora que he cambiado a la nueva Toolbar . En mi caso, quiero registrar el usuario en si intentan abrir el navegador lateral mientras se desconecta, (y coger el evento para que el navegador lateral no se abra). En tu caso no podrías return true; .

 @Override public boolean onOptionsItemSelected(MenuItem item) { if (!isLoggedIn() && item.getItemId() == android.R.id.home) { login(); return true; } return mDrawerToggle.onOptionsItemSelected(item) || super.onOptionsItemSelected(item); } 
  • Cajón de navegación Animación android
  • Cómo actualizar la lista del cajón de navegación tan pronto como su abrir / cerrar en Android
  • ¿Puedo abrir el diseño del cajón con animación mediante programación?
  • Android en el cajón cerrado escucha
  • Reemplazar el diseño de la barra de herramientas de acuerdo con el fragmento visualizado
  • La barra de notificaciones es gris después de implementar Nav Drawer
  • Cajón de navegación - Desactivar clic en los elementos detrás del cajón
  • Añadir 2 listview en el cajón de navegación, sólo uno funciona
  • NavigationDrawer con Actividades vs. NavigationDrawer con Fragments
  • ¿Cómo crear un cajón de navegación personalizado que abre ListView junto al cajón onitemclick?
  • Alternar el cajón de navegación 'abrir' en el botón / clic de imagen
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.