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.
- Establecer el margen de arrastre para el Cajón de navegación Android
- Android Navigation Drawer (actividades de llamada) con AbstractMainActivity
- Cómo crear un cajón de navegación sin biblioteca de soporte
- ActionBarDrawerToggle no está configurando el Indicador de cajón
- Incluyendo fila en la parte inferior del cajón de navegación
- Optimizar el cajón y la velocidad de lanzamiento de la actividad
- DrawerLayout se debe medir con MeasureSpec.EXACTLY error
- Icono de Android ic_drawer.png en color blanco?
- Cómo mostrar / ocultar el cajón de navegación mediante programación
- Cajón de navegación Android Studio 1.4
- Dos cajones de navegación en la misma actividad
- Cambiar el icono del cajón de nuevo a la flecha de retroceso
- El cajón de navegación no funciona en las versiones pre-ICS
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 laActionBar
,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
- Diferencia entre tarea y proceso en Android
- ¿Cómo mover directamente la cámara a la ubicación actual en Google Maps Android API v2?