Implementé la biblioteca appcompat más nueva y utilicé la Toolbar
barra de acciones como. Pero el problema es que no puedo captar el evento de clic del botón de inicio / icono de hamburguesa. He intentado y buscado todo, pero no parece encontrar un problema similar.
Esta es mi Activity
clase:
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 hago 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 de "inicio seleccionado". También configuré un onOptionsItemSelected
método dentro de mi Activity
, pero todavía no se llama.
fuente
en mi caso este código funciona perfecto
fuente
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.
fuente
Creo que la solución correcta con la biblioteca de soporte 21 es la siguiente
fuente
this.getResValues().homeIconDrawable()
, ¿Quién esthis
?y en cada uno
onViewCreated
llamofuente
Así es como lo implementé en el diseño de materiales previos y parece que todavía funciona ahora que me cambié al nuevo
Toolbar
. En mi caso, quiero que el usuario inicie sesión si intenta abrir el navegador lateral mientras está desconectado (y captar el evento para que el navegador lateral no se abra). En tu caso no podríasreturn true;
.fuente
Cambié un poco DrawerLayout para obtener los eventos y poder consumir un evento, por ejemplo, si desea usar actionToggle como atrás si está en la vista detallada:
fuente
El enfoque más fácil que podríamos hacer es cambiar el ícono de inicio a un ícono conocido y comparar elementos de diseño (porque el ícono de android.R.id.home puede diferir de las diferentes versiones de la API
así que configure una barra de herramientas como barra de acción SetSupportActionBar (_toolbar);
fuente
En mi caso tuve que poner el icono usando:
Y luego escuche los eventos de clic con onOptionsItemSelected predeterminado y android.R.id.home id
fuente
android.R.id.home
Para cualquiera que busque una implementación de Xamarin (dado que los eventos se realizan de manera diferente en C #), simplemente creé esta
NavClickHandler
clase de la siguiente manera:Luego, asigne un botón de menú de hamburguesa personalizado como este:
Y finalmente, asigné al alternador del menú del cajón un ToolbarNavigationClickListener del tipo de clase que creé anteriormente:
Y luego tienes un botón de menú personalizado, con eventos de clic manejados.
fuente
Prueba este código
Agregue el siguiente código a su método onCreate ()
fuente