Problemas en el uso de nuevo componente de la barra de herramientas, ocultar y mostrar Icono del cajón de navegación, icono de inicio de clic de iconos de fragmentos

Comencé recientemente a actualizar mi aplicación para utilizar el nuevo componente de barra de herramientas introducido en Android 5.0 con el cajón de navegación. Flujo de la aplicación es: MainActivity que tiene una barra de herramientas, cajón de navegación con el menú 1. Inicio 2. Carrito.

El menú de inicio navega a "Detalle del hogar" a través de un botón en él.

Diseño de "MainActivity":

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <include android:id="@+id/toolbar" layout="@layout/toolbar" /> <android.support.v4.widget.DrawerLayout android:id="@+id/drawer" android:layout_width="match_parent" android:layout_height="match_parent" > <FrameLayout android:id="@+id/activity_frame" android:layout_width="match_parent" android:layout_height="match_parent"/> <ListView android:id="@+id/left_drawer" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="start" android:background="@android:color/white" android:choiceMode="singleChoice" android:divider="@android:color/transparent" android:dividerHeight="0dp" android:listSelector="@android:color/transparent" /> </android.support.v4.widget.DrawerLayout> 

Estoy agregando dos fragmentos HomeFragment, CartFragment en "MainActivity" en el menú seleccionado desde el cajón como a continuación, la selección por defecto es la posición 0, es decir, "Inicio"

Clase "MainActivity.java" ::

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mTitle = mDrawerTitle = getTitle(); drawer = (DrawerLayout) findViewById(R.id.drawer); mToolbar = (Toolbar) findViewById(R.id.toolbar); tvTitle = (TextView) mToolbar.findViewById(R.id.toolbar_title); if (mToolbar != null) { setSupportActionBar(mToolbar); } mDrawerToggle = new ActionBarDrawerToggle(this, drawer,mToolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close) { public void onDrawerClosed(View view) { getSupportActionBar().setTitle(mTitle); } public void onDrawerOpened(View drawerView) { getSupportActionBar().setTitle(mDrawerTitle); } }; drawer.setDrawerListener(mDrawerToggle); mDrawerList = (ListView) findViewById(R.id.left_drawer); dataList = new ArrayList<DrawerItem>(); dataList.add(new DrawerItem(Constants.V_HOME, R.drawable.ic_launcher)); dataList.add(new DrawerItem(Constants.V_MY_CART, R.drawable.ic_launcher)); mDrawerList.setAdapter(adapterDrawer); mDrawerList.setOnItemClickListener(new DrawerItemClickListener()); // to show first "Home fragment" on start up of application if(savedInstanceState==null) SelectItem(0); } public void SelectItem(int position) { Fragment fragment = null; switch (position) { case 0: fragment = new HomeFragment(); replaceFragment(fragment, Constants.V_TAG_HOME,false,"Home"); break; case 1: fragment = new CartFragment(); replaceFragment(fragment, Constants.V_TAG_MY_CART,false,"My Cart"); break; } drawer.closeDrawer(mDrawerList); } public void replaceFragment(Fragment fragment,String fragment_tag,boolean showHome,String title){ frgManager = this.getSupportFragmentManager(); FragmentTransaction ft = frgManager.beginTransaction(); ft.replace(R.id.activity_frame,fragment,fragment_tag); if(showHome) ft.addToBackStack(null); ft.commit(); shouldDisplayHomeUp(showHome); } public void shouldDisplayHomeUp(boolean showHome){ if(showHome){ mDrawerToggle.setDrawerIndicatorEnabled(false); drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); getSupportActionBar().setHomeButtonEnabled(true); getSupportActionBar().setDisplayHomeAsUpEnabled(true); }else{ mDrawerToggle.setDrawerIndicatorEnabled(true); drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED); getSupportActionBar().setDisplayHomeAsUpEnabled(false); getSupportActionBar().setHomeButtonEnabled(false); } } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: Toast.makeText(getApplicationContext(),"main act clicked", Toast.LENGTH_SHORT).show(); return false; default: return super.onOptionsItemSelected(item); } } @Override public void onBackPressed() { // TODO Auto-generated method stub if(frgManager.getBackStackEntryCount()>0){ getSupportFragmentManager().popBackStack(); // show the drawer icon when on moving back shouldDisplayHomeUp(false); }else{ super.onBackPressed(); } mDrawerToggle.syncState(); } 

Mi fragmento de casa tiene el botón "Detalle" al hacer clic en el botón, sustituye a otro fragmento: "HomeDetailFragment"

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:id="@+id/btnDetail" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Home detail" /> <FrameLayout android:id="@+id/home_frame_container" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout> 

Clase "HomeFragment.java" Evento click btnDetail que sustituye a otro fragmento "HomeDetailFragment" ::

 btnDetail.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Fragment fragment = new HomeDetailFragment(); ((MainActivity)getActivity()).showDrawerIndicator(false); FragmentManager frManager = getActivity().getSupportFragmentManager(); FragmentTransaction ft = frManager.beginTransaction(); ft.addToBackStack(null); ft.replace(R.id.activity_frame, fragment).commit(); } }); 

Clase "HomeDetailFragment.java" ::

 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); // update the actionbar to show the up carat/affordance ((MainActivity)getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { // TODO Auto-generated method stub super.onCreateOptionsMenu(menu, inflater); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: // your code for order here Toast.makeText(getActivity(), "home detail", Toast.LENGTH_LONG).show(); ((MainActivity)getActivity()).onBackPressed(); return true; } return true; } 

Mis problemas ::

1. En "HomeDetailFragment", puedo ver el "UP icono de inicio", pero no puede obtener el evento de clic del icono de casa onOptionsItemSelected no se llama, por lo que no puede volver a HomeFragment

2. Al presionar el botón de retroceso del teléfono y, de nuevo, navegar hasta "Detalle del hogar", no se muestra "UP icono de inicio"

Por favor guíame.

  1. En "HomeDetailFragment", puedo ver el "UP icono de inicio", pero no puede obtener el evento de clic del icono de inicio onOptionsItemSelected no se llama, por lo que no puede volver a HomeFragment

Una forma de lograr esto es utilizando la Toolbar de Toolbar de su MainActivity así:

 Toolbar mToolbar= ((MainActivity)getActivity()).mToolbar; mToolbar.setNavigationIcon(getResources().getDrawable(R.drawable.ic_nav_back)); mToolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.d("MrE", "home selected"); } }); 

  1. Al presionar el botón de retroceso del teléfono y, de nuevo, navega hasta "Detalle de inicio", no aparece "Icono de inicio de UP"

La razón por la que su código no se llama es porque está en el onCreate de su fragmento. Muévalo al onCreateOptionsMenu lugar de hacerlo actualizar.

 @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { // Put toolbar stuff from above here super.onCreateOptionsMenu(menu, inflater); } 

Tuve el problema exacto.

Utilice el método setToolbarNavigationClickListener .

En MainActivity.java,

 actionBarToggle.setToolbarNavigationClickListener(new View.OnClickListener({ @Override public void onClick(View v) { MainActivity.this.onSupportNavigateUp(); } }); 

Evite implementar la navegación individualmente en Fragmentos.

  1. Has llamado a getSupportActionBar().setDisplayHomeAsUpEnabled(true) que muestra el botón en la barra de herramientas pero no la activa. Llamando a getSupportActionBar().setHomeButtonEnabled(true); Además debe hacer el trabajo.

  2. Muestra el botón de retroceso en la barra de herramientas de dentro del fragmento que es algo que evitaría. Trate de mover esta parte a su actividad, cuando realice la FragmentTransaction.

  • Android DrawerLayout.setDrawerLockMode () no funciona
  • Diseño del cajón de navegación el título en la barra de herramientas no cambia
  • Android lollipop toolbar conmutador entre abrir / cerrar el cajón y el botón Atrás
  • No se puede agregar pestañas dentro de Fragmento de cajón de navegación Android
  • Cómo agregar barra de acción personalizada con el cajón de navegación?
  • Indicador de cajón en lollipop play store
  • El cajón de navegación se cerrará incluso si se sobreescribe OnBackPressed ()
  • OnCreateOptionsMenu () en el fragmento que no reemplaza los menús de ActionBar
  • ¿Cómo configurar el color / estilo personalizado de ActionBar?
  • El título de CollapsingToolbarLayout desaparece
  • Icono del menú izquierdo en la barra de acciones de Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.