Cajón de navegación para cambiar las actividades en lugar de fragmentos

¿Es posible utilizar un cajón de navegación en android, pero en lugar de actualizar fragmentos, me gustaría cambiar entre las actividades como mi medio de navegación dentro de la aplicación.

Sí, es posible – es lo que hice para mi aplicación. Ya tenía una serie de actividades establecidas, y en lugar de convertir todos ellos en fragmentos, quería adaptar el cajón de navegación para trabajar en todos ellos. Desafortunadamente, no es una solución rápida, así que si tienes la opción de usar fragmentos, me iría con eso. Pero sin importar aquí es cómo lo hice:

Digamos que tengo dos actividades, ambas de las cuales quiero tener el cajón de navegación. En el layout.xml para cada uno, especificé un DrawerLayout con el ListView apropiado para mantener mis opciones de navegación. Esencialmente, el cajón de navegación se hace cada vez que cambia entre las actividades, dando la apariencia de que es persistente. Para hacer la vida mucho más fácil, tomé los métodos comunes necesarios para configurar el cajón de navegación y ponerlos en su propia clase: NavigationDrawerSetup.java . De esta manera mis actividades pueden usar el mismo adaptador personalizado, etc.

Dentro de esta clase NavigationDrawerSetup.java , tengo lo siguiente:

  • configureDrawer() : configura la ActionBar , ActionBarDrawerToggle y los oyentes requeridos
  • Mi adaptador de matriz personalizado (para rellenar las opciones de navegación dentro de la lista)
  • El método selectOptions() , que controla los clics de elementos del cajón

Cuando configure el cajón de navegación dentro de una de sus actividades, simplemente cree un nuevo objeto NavigationDrawerSetup y pase los parámetros de diseño necesarios (como DrawerLayout , ListView , etc.). Entonces llamaría a configureDrawer() :

  navigationDrawer = new NavigationDrawerSetup(mDrawerView, mDrawerLayout, mDrawerList, actionBar, mNavOptions, currentActivity); navigationDrawer.configureDrawer(); 

currentActivity se pasa en ya que el cajón de navegación está vinculado a la actividad que está en. Tendrá que usarlo cuando configure el ActionBarDrawerToggle :

 mDrawerToggle = new ActionBarDrawerToggle(currentActivity, // host Activity mDrawerLayout, /* DrawerLayout object */ R.drawable.ic_drawer, /* nav drawer image to replace 'Up' caret */ R.string.drawer_open, /* "open drawer" description for accessibility */ R.string.drawer_close /* "close drawer" description for accessibility */ ) 

También necesitará usar currentActivity al configurar su Adapter personalizado:

En cuanto a cómo cambiar entre las actividades a través del cajón de navegación, sólo puede configurar nuevas intenciones dentro de su método selectItem ():

 private void selectItem(int position) { // Handle Navigation Options Intent intent; switch (position) { case 0: intent = new Intent(currentActivity, NewActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); currentActivity.startActivity(intent); break; case 1: // etc. } 

Sólo asegúrese de que su nueva Activity también tiene la configuración del cajón de navegación y debe mostrar.

Hay un montón de cosas que puede hacer para personalizar este método a sus propias necesidades, pero esta es la estructura general de cómo lo hice. ¡Espero que esto ayude!

Necesita una BaseDrawerActivity que implemente el Cajón de Navegación y luego extienda la BaseDrawerActivity en cada actividad que necesite.

Primero crea BaseDrawerActivity.java :

 public class BaseDrawerActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener{ DrawerLayout drawerLayout; Toolbar toolbar; FrameLayout frameLayout; NavigationView navigationView; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.setContentView(R.layout.activity_base_drawer);; Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); frameLayout = (FrameLayout) findViewById(R.id.content_frame); drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); ActionBarDrawerToggle toggle = new ActionBarDrawerToggle( this, drawerLayout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); drawerLayout.setDrawerListener(toggle); toggle.syncState(); navigationView = (NavigationView) findViewById(R.id.nav_view); navigationView.setNavigationItemSelectedListener(this); } @Override public void onBackPressed() { if (drawerLayout.isDrawerOpen(GravityCompat.START)) { drawerLayout.closeDrawer(GravityCompat.START); } else { super.onBackPressed(); } } @Override public boolean onNavigationItemSelected(MenuItem item) { int id = item.getItemId(); //to prevent current item select over and over if (item.isChecked()){ drawerLayout.closeDrawer(GravityCompat.START); return false; } if (id == R.id.nav_camera) { // Handle the camera action startActivity(new Intent(getApplicationContext(), CameraActivity.class)); } else if (id == R.id.nav_gallery) { startActivity(new Intent(getApplicationContext(), GalleryActivity.class)); } else if (id == R.id.nav_slideshow) { startActivity(new Intent(getApplicationContext(), SlideshowActivity.class)); } else if (id == R.id.nav_manage) { startActivity(new Intent(getApplicationContext(), ManageActivity.class)); } else if (id == R.id.nav_share) { startActivity(new Intent(getApplicationContext(), ShareActivity.class)); } else if (id == R.id.nav_send) { startActivity(new Intent(getApplicationContext(), SendActivity.class)); } drawerLayout.closeDrawer(GravityCompat.START); return true; } } 

A continuación, cree activity_base_drawer.xml en la carpeta res/layout :

 <?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" tools:openDrawer="start"> <include layout="@layout/app_bar_home"/> <android.support.design.widget.NavigationView android:id="@+id/nav_view" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" app:headerLayout="@layout/nav_header_home" app:menu="@menu/activity_home_drawer" /> </android.support.v4.widget.DrawerLayout> 

Donde @layout/app_bar_home es:

 <?xml version="1.0" encoding="utf-8"?> <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true"> <android.support.design.widget.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="@style/AppTheme.AppBarOverlay"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" app:popupTheme="@style/AppTheme.PopupOverlay" /> </android.support.design.widget.AppBarLayout> <FrameLayout android:id="@+id/content_frame" android:layout_width="match_parent" android:layout_height="match_parent" /> </android.support.design.widget.CoordinatorLayout> 

A continuación, ingrese sus Actividades que tendrán un Cajón de Navegación como CameraActivity.java :

 public class CameraActivity extends BaseDrawerActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getLayoutInflater().inflate(R.layout.activity_camera, frameLayout); /** * Setting title */ setTitle("Camera"); } @Override protected void onResume() { super.onResume(); // to check current activity in the navigation drawer navigationView.getMenu().getItem(0).setChecked(true); } } 

Donde R.layout.activity_camera es su diseño para CameraActivity.java .

A continuación, crear otra actividad como GalleryActivity.java y así sucesivamente que tendrá el cajón de navegación:

 public class GalleryActivity extends BaseDrawerActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getLayoutInflater().inflate(R.layout.activity_gallery, frameLayout); // Setting title setTitle("Gallery"); } @Override protected void onResume() { super.onResume(); navigationView.getMenu().getItem(1).setChecked(true); } } 

Como una pequeña mejora de la solución señalada por @ David-Crozier, con el fin de evitar la superposición de ambas animaciones (cerrar el NavigationDrawer y comenzar una nueva actividad), puede incluir un poco de retraso en su método como se hizo en la aplicación iosched V2014:

 private void onNavDrawerItemClicked(final int itemId) { if (itemId == getSelfNavDrawerItem()) { mDrawerLayout.closeDrawer(GravityCompat.START); return; } if (isSpecialItem(itemId)) { goToNavDrawerItem(itemId); } else { // launch the target Activity after a short delay, to allow the close animation to play mHandler.postDelayed(new Runnable() { @Override public void run() { goToNavDrawerItem(itemId); } }, NAVDRAWER_LAUNCH_DELAY); // change the active item on the list so the user can see the item changed setSelectedNavDrawerItem(itemId); // fade out the main content View mainContent = findViewById(R.id.main_content); if (mainContent != null) { mainContent.animate().alpha(0).setDuration(MAIN_CONTENT_FADEOUT_DURATION); } } mDrawerLayout.closeDrawer(GravityCompat.START); } 

Aquí el enlace para referencia: https://github.com/google/iosched/blob/master/android/src/main/java/com/google/samples/apps/iosched/ui/BaseActivity.java

  • Cambiar el idioma del elemento navigationdrawer
  • Adición de un diseño lineal al cajón de navegación (termina chocando con un ClassCastException)
  • Cómo crear mini-menú de cajones en Android?
  • Cómo agregar un grupo al cajón de navegación mediante programación
  • Configurar el color de fondo del cajón de navegación
  • Elemento en negrita después de la selección
  • ¿Cómo mostrar la imagen de perfil de Facebook en el cajón de navegación android?
  • Guardar estado de fragmentos con el cajón de navegación
  • Animación de sugerencias de NavigationDrawer (como Google Currents)
  • Retardo de cajón de navegación en Android
  • Detección del estado de la aplicación de currículum de diferentes android estado de navegación
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.