android - personalizar - "Botón de retroceso" usando getSupportActionbar y appcompat v7 toolbar
toolbar android example (8)
1- Crear diseño de
Toolbar
;
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:local="http://schemas.android.com/apk/res-auto"
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/dark_blue"
android:minHeight="?attr/actionBarSize"
local:popupTheme="@style/ThemeOverlay.AppCompat.Light"
local:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />
2- Incluya esto en su diseño en el lugar donde desea que esté la
toolbar
de
toolbar
.
3- Pega el siguiente código en tu actividad (extiende
ActionBarActivity
)
private Toolbar mToolbar;
//For Toolbar (Action bar) start
mToolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(mToolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
mToolbar.setNavigationIcon(R.drawable.ic_back_arrow);
mToolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onBackPressed();
}
});
getSupportActionBar().setTitle("Event Details");
//For Toolbar (Action bar) end
4- cambia el ícono de clic de retroceso a lo que quieras
Estoy usando la nueva barra de herramientas de la biblioteca Appcompat V7 y estoy haciendo una aplicación con el cajón de navegación y con fragmentos.
En algunos fragmentos no quiero mostrar el ícono de la hamburguesa sino la flecha en su lugar ... Está bien, hice esto de esta manera:
mDrawerToggle.setDrawerIndicatorEnabled(false);
mDrawerToggle.syncState();
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
getSupportActionBar().setHomeAsUpIndicator(R.drawable.abc_ic_ab_back_mtrl_am_alpha);
Mi pregunta es: ¿Cómo o dónde necesito configurar el botón de inicio o lo que necesito para escuchar el botón "Atrás"? Quiero llamar al método principal comprimido y volver a configurar el icono del cajón de navegación con el icono de hamburguesa.
Agregar setDisplayHomeAsUpEnabled (verdadero)
Toolbar toolbar = findViewById(R.id.toolbar);
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
}
Maneja el botón de retroceso
public boolean onSupportNavigateUp() {
onBackPressed();
return true;
}
Agregue este método en
onCreate()
:
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
Luego anule
onOptionItemSelected()
como se muestra a continuación:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
onBackPressed();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
No estoy seguro de si esto funciona en el caso de OP, pero en muchos casos esta es probablemente la opción más simple para implementar el botón Atrás con la barra de herramientas de AppCompat.
Omita todos los elementos
setHomeButtonEnabled
,
setDisplayHomeAsUpEnabled
y
onOptionsItemSelected
, y
problemas relacionados
.
En cambio, al inicializar la barra de herramientas, simplemente configure 1) icono de navegación y 2) navegación OnClickListener para ello:
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
if (enableBackNavigation) {
toolbar.setNavigationIcon(R.drawable.ic_back);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onBackPressed();
}
});
}
Puedes hacerlo así:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
toolbar = (Toolbar)findViewById(R.id.toolbar);
if (toolbar != null) {
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
setUpNavigationDrawer();
getFragmentManager().addOnBackStackChangedListener(backStackListener); // listen to the backstack of the fragment manager
}
Defina el onBackSTackChangedListener:
private FragmentManager.OnBackStackChangedListener backStackListener = new FragmentManager.OnBackStackChangedListener() {
@Override
public void onBackStackChanged() {
setNavIcon();
};
}
Establezca el icono de acuerdo con la pila de su fragmento:
protected void setNavIcon() {
int backStackEntryCount = getFragmentManager().getBackStackEntryCount();
drawerToggle.setDrawerIndicatorEnabled(backStackEntryCount == 0);
}
Detectar cuando se presiona el icono del cajón:
public boolean onOptionsItemSelected(MenuItem item) {
if (drawerToggle.isDrawerIndicatorEnabled() && drawerToggle.onOptionsItemSelected(item)) {
return true;
}
switch (item.getItemId()) {
case x:
return true;
default:
return false;
}
}
Y maneja el botón arriba:
public boolean onSupportNavigateUp() {
onBackPressed();
return true;
}
Esto funciona para mi. Buena suerte.
Simplemente puede configurar el icono de navegación y asegurarse de que está configurando
setNavigationOnClickListener()
después de configurar
setSupportActionBar(toolbar)
toolbar.setNavigationIcon(getResources().getDrawable(R.drawable.ic_arrow_back));
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onBackPressed();
}
});
activa el botón de retroceso:
getActionBar().setDisplayHomeAsUpEnabled(enable);
y escuche los clics en
onBackPressed()
Obviamente su actividad debe extender
ActionBarActivity
en manifiesto, agregue estas líneas debajo de la actividad en la que desea que funcione la flecha hacia atrás
android: parentActivityName = "Su nombre de actividad principal"