"Botón Atrás" mediante la barra de herramientas getSupportActionbar y appcompat v7
Estoy utilizando 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 icono de la hamburguesa sino la flecha en su lugar … Eso está bien, hice esto de esta manera:
- Styling ActionMode ActionBar en Android 5.0 Lollipop (con AppCompat)
- Cómo evitar DEX 64K LIMIT importando la biblioteca correcta
- No se encontró ningún recurso que coincida con el nombre dado: attr 'android: actionModeShareDrawable' appcompat-v7: 21.0.0 con compileSdkVersion 21
- Error gradle cuando Theme declare-styleable en dos bibliotecas
- El botón de radio creado dinámicamente o CheckBox no utiliza el acento de color
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 la siguiente: ¿Cómo o dónde necesito configurar el botón de inicio del teléfono o lo que necesito para escuchar el botón "Atrás"? Quiero llamar al método principal backpressed y volver atrás el icono del cajón de navegación con el icono de hamburguesa ..
- Viendo el mensaje en los registros: "app: theme is deprecated"?
- ¿Qué es SortedList <T> trabajando con RecyclerView.Adapter?
- NoClassDefFoundError: Resolución fallida de: Landroid / support / v7 / appcompat / R $ styleable
- Quitar icono de la vista de búsqueda del texto de la pista
- ID duplicado @ + id / imagen en appcompat_v7 abc_activity_chooser_view.xml: 58
- Junit.framework.AssertionFailedError: Excepción en constructor: (java.lang.NoClassDefFoundError)
- ¿Necesito AppCompatActivity y v7 Support Bibliotecas con mínimo sdk 21?
- Indeterminado Horizontal ProgressBar ABAJO ActionBar usando AppCompat?
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 }
Definir el onBackSTackChangedListener:
private FragmentManager.OnBackStackChangedListener backStackListener = new FragmentManager.OnBackStackChangedListener() { @Override public void onBackStackChanged() { setNavIcon(); }; }
Establecer el icono de acuerdo a su backstack 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 manejar el botón de arriba:
public boolean onSupportNavigateUp() { onBackPressed(); return true; }
Esto funciona para mí. Buena suerte.
Agregue este método en onCreate()
:
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
A continuación, anule el onOptionItemSelected()
como se onOptionItemSelected()
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 está seguro 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 todas las setHomeButtonEnabled
, setDisplayHomeAsUpEnabled
y onOptionsItemSelected
y los problemas relacionados .
En cambio, al inicializar la barra de herramientas, simplemente establezca 1) icono de navegación y 2) OnClickListener de navegación 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(); } }); }
1- Crear el diseño de la 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 sea la toolbar
de toolbar
.
3- Pegue el siguiente código en su actividad. ( 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 icono de clic de nuevo a lo que quieras.
Active el botón de retroceso:
getActionBar().setDisplayHomeAsUpEnabled(enable);
Y escuchar los clics en onBackPressed()
Obviamente, su actividad debe extender ActionBarActivity
Simplemente puede configurar el icono de navegación y asegúrese de que está configurando setNavigationOnClickListener()
después de establecer setSupportActionBar(toolbar)
toolbar.setNavigationIcon(getResources().getDrawable(R.drawable.ic_arrow_back)); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { onBackPressed(); } });