son personalizar ocultar mostrar menus mac las herramientas fijo enviar direcciones desaparecido dejar cuales como boton barra bar agregar android navigation-drawer android-toolbar

android - personalizar - No se puede detectar el evento de clic del botón de inicio de la barra de herramientas



ocultar barra de direcciones firefox (11)

He manejado atrás y el 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"); }

Implementé la biblioteca más reciente de appcompat y utilicé la Toolbar como barra de acción. Pero el problema es que no puedo ver el botón de inicio / evento de clic del icono de hamburguesa. He intentado y examinado 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 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 del menú, se llama al registro "elemento seleccionado". Pero cuando hago clic en el botón de inicio, se abre el cajón de navegación, pero nunca se llama al registro "inicio seleccionado". También configuré el método onOptionsItemSelected dentro de mi Activity , pero aún no se llama.


Así es como implementé el diseño previo al material y parece que todavía funciona ahora que cambié a la nueva Toolbar . En mi caso, quiero iniciar sesión en el usuario si intentan abrir el navegador lateral mientras está desconectado (y detectar el evento para que el navegador lateral no se abra). En su caso, no podría 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); }


Así es como lo hago para volver al fragmento correcto; de lo contrario, si tiene varios fragmentos en el mismo nivel, volvería al primero si no anula el comportamiento del botón de retroceso de la barra de herramientas.

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


Cambié un poco el DrawerLayout para obtener los eventos y poder consumirlos y eventos, como si desea usar actionToggle como retroceso si está en la vista detallada:

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


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


El enfoque más fácil que podríamos hacer es cambiar el ícono de inicio a un ícono conocido y comparar elementos dibujables (porque el ícono android.R.id.home puede diferir según las diferentes versiones de la API)

establezca 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 ícono 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 predeterminado onOptionsItemSelected y android.R.id.home id


Para cualquiera que busque una implementación de Xamarin (dado que los eventos se realizan de manera 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); } } }

Luego, asignó un botón de menú de hamburguesa personalizado como este:

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

Y finalmente, asigné al menú del cajón para alternar un ToolbarNavigationClickListener del tipo de clase que creé anteriormente:

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

Y luego tienes un botón de menú personalizado, con 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); }

Agregue el siguiente código a su método onCreate ()

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


Si desea saber cuándo se hace clic en el hogar es una AppCompatActivity entonces debe intentarlo así:

Primero dígale a Android que desea usar su Toolbar como su ActionBar :

setSupportActionBar(toolbar);

Luego configure 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 usar 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 su Toolbar de Toolbar donde solía estar el botón de "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 cuándo 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 de llamada cumplen con sus requisitos.


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

en mycase este código funciona perfecto