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.
- No se puede resolver el método getActivity ()
- Buenas prácticas: Cajón de navegación
- Icono de hamburguesa no se muestra en el fragmento de cajón de navegación
- Cambiar el color de fondo del elemento seleccionado en el cajón de navegación
- Adaptar chrisbanes ActionBar-PullToRefresh a fragmentos (NavigationDrawer)
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.
- Android: Capaz de hacer clic a través del cajón de nav? AppCompat v7: r21
- Cajón de navegación debajo de la Barra de Acción
- Cajón de navegación - ¿qué hace syncState () y por qué debe llamarse dentro onPostCreate ()?
- Gestor de navegación Android mejores prácticas
- Estado del fragmento del cajón de navegación de Android
- Imitando el cajón de navegación de la aplicación youtube / gmail
- Cajón de navegación con la actividad y el niño Fragmentos
- Mover el sherlock de la barra de acción con el menú de navegación del cajón
- 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"); } });
- 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.
-
Has llamado a
getSupportActionBar().setDisplayHomeAsUpEnabled(true)
que muestra el botón en la barra de herramientas pero no la activa. Llamando agetSupportActionBar().setHomeButtonEnabled(true);
Además debe hacer el trabajo. -
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.
- ¿Cómo mostrar fórmulas matemáticas en mi aplicación Android?
- Content: // mms-sms / conversations / return NullPointerException en Android ICS Samsung