Hice un cajón de navegación funcional como se muestra en el tutorial en el sitio web developer.android.com . Pero ahora, quiero usar un cajón de navegación, que creé en NavigationDrawer.class para múltiples actividades en mi aplicación.
Mi pregunta es, si alguien aquí puede hacer un pequeño tutorial, que explica cómo usar un cajón de navegación para múltiples actividades.
Lo leí primero en esta respuesta Android Navigation Drawer en múltiples actividades
pero no funcionó en mi proyecto
public class NavigationDrawer extends Activity {
public DrawerLayout drawerLayout;
public ListView drawerList;
private ActionBarDrawerToggle drawerToggle;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
drawerToggle = new ActionBarDrawerToggle((Activity) this, drawerLayout, R.drawable.ic_drawer, 0, 0) {
public void onDrawerClosed(View view) {
getActionBar().setTitle(R.string.app_name);
}
public void onDrawerOpened(View drawerView) {
getActionBar().setTitle(R.string.menu);
}
};
drawerLayout.setDrawerListener(drawerToggle);
getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setHomeButtonEnabled(true);
layers = getResources().getStringArray(R.array.layers_array);
drawerList = (ListView) findViewById(R.id.left_drawer);
View header = getLayoutInflater().inflate(R.layout.drawer_list_header, null);
drawerList.addHeaderView(header, null, false);
drawerList.setAdapter(new ArrayAdapter<String>(this, R.layout.drawer_list_item, android.R.id.text1,
layers));
View footerView = ((LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(
R.layout.drawer_list_footer, null, false);
drawerList.addFooterView(footerView);
drawerList.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int pos, long arg3) {
map.drawerClickEvent(pos);
}
});
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (drawerToggle.onOptionsItemSelected(item)) {
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
drawerToggle.syncState();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
drawerToggle.onConfigurationChanged(newConfig);
}
}
En esta actividad quiero tener el cajón de navegación, así que extiendo 'NavigationDrawer' y en algunas otras actividades quiero usar el mismo cajón de navegación
public class SampleActivity extends NavigationDrawer {...}
No se que cambiar ...
Respuestas:
Si desea un cajón de navegación, debe usar fragmentos. Seguí este tutorial la semana pasada y funciona muy bien:
http://developer.android.com/training/implementing-navigation/nav-drawer.html
También puede descargar un código de muestra de este tutorial para ver cómo puede hacer esto.
Sin fragmentos:
Este es su Código de Actividad Base:
Todas las demás actividades que necesitan tener un cajón de navegación deben extender esta actividad en lugar de la actividad en sí misma, por ejemplo:
XML
Editar:
Experimenté algunas dificultades, así que aquí hay una solución si obtienes NullPointerExceptions. En BaseActivity cambie la función onCreate a
protected void onCreateDrawer()
. El resto puede permanecer igual. En las Actividades que extienden BaseActivity, coloque el código en este orden:Esto me ayudó a solucionar mi problema, ¡espero que ayude!
Así es como puede crear un cajón de navegación con múltiples actividades, si tiene alguna pregunta, no dude en preguntar.
Edición 2:
Como dijo @GregDan
BaseActivity
, también puede anularsetContentView()
y llamar aCreateDrawer allí:fuente
He encontrado la mejor implementación. Está en la aplicación Google I / O 2014 .
Usan el mismo enfoque que el de Kevin. Si puede abstraerse de todas las cosas innecesarias en la aplicación de E / S, podría extraer todo lo que necesita y Google le asegura que es un uso correcto del patrón del cajón de navegación. Cada actividad opcionalmente tiene un
DrawerLayout
como su diseño principal. La parte interesante es cómo se realiza la navegación a otras pantallas. Se implementa deBaseActivity
esta manera:Esto difiere de la forma común de reemplazar el fragmento actual por una transacción de fragmento. Pero el usuario no detecta una diferencia visual.
fuente
overridePendingTransitions
.Entonces, esta respuesta se retrasa unos años, pero alguien puede apreciarla. Android nos ha dado un nuevo widget que facilita el uso de un cajón de navegación con varias actividades.
android.support.design.widget.NavigationView es modular y tiene su propio diseño en la carpeta del menú. La forma en que lo usa es envolver los diseños xml de la siguiente manera:
Root Layout es un android.support.v4.widget.DrawerLayout que contiene dos elementos secundarios: uno
<include ... />
para el diseño que se está envolviendo (ver 2) y un android.support.design.widget.NavigationView.nav_header_main es solo un LinearLayout con orientación = vertical para el encabezado de su Navegación Drawar.
activity_main_drawer es un menú xml en su directorio res / menu. Puede contener elementos y grupos de su elección. Si utiliza la Galería de AndroidStudio, el asistente creará uno básico para usted y podrá ver cuáles son sus opciones.
El diseño de la barra de aplicaciones generalmente es ahora un android.support.design.widget.CoordinatorLayout y esto incluirá dos hijos: un android.support.design.widget.AppBarLayout (que contiene un android.support.v7.widget.Toolbar) y un
<include ... >
para Su contenido real (ver 3).El diseño del contenido puede ser el diseño que desee. Este es el diseño que contiene el contenido principal de la actividad (sin incluir el cajón de navegación o la barra de aplicaciones).
Ahora, lo bueno de todo esto es que puede ajustar cada actividad en estos dos diseños, pero que su NavigationView (consulte el paso 1) siempre apunte a activity_main_drawer (o lo que sea). Esto significa que tendrá el mismo (*) Navegador de navegación en todas las actividades.
fuente
La forma más fácil de reutilizar un cajón de navegación común entre un grupo de actividades
app_base_layout.xml
AppBaseActivity.java
fuente
AppBaseActivity
y lasetContentView
forma predeterminada.Para cualquier otra persona que busque hacer lo que le pide el póster original, considere usar fragmentos en lugar de la forma en que Kevin lo dijo. Aquí hay un excelente tutorial sobre cómo hacer eso:
https://github.com/codepath/android_guides/wiki/Fragment-Navigation-Drawer
Si opta por utilizar actividades en lugar de fragmentos, se encontrará con el problema de que el cajón de navegación se vuelva a crear cada vez que navegue a una nueva actividad. Esto da como resultado una representación fea / lenta del cajón de navegación cada vez.
fuente
Mi sugerencia es: no use actividades en absoluto, en su lugar use fragmentos y reemplácelos en el contenedor (diseño lineal, por ejemplo) donde muestra su primer fragmento.
El código está disponible en Tutoriales para desarrolladores de Android, solo tiene que personalizarlo.
http://developer.android.com/training/implementing-navigation/nav-drawer.html
Es aconsejable que use más y más fragmentos en su aplicación, y solo debe haber cuatro actividades básicas locales para su aplicación, que mencione en su AndroidManifest.xml aparte de las externas (FacebookActivity por ejemplo):
SplashActivity: no usa ningún fragmento y usa el tema de pantalla completa.
LoginSignUpActivity: no requiere NavigationDrawer en absoluto, y tampoco el botón de retroceso, así que simplemente use la barra de herramientas normal, pero al menos, se requerirán 3 o 4 fragmentos. Utiliza el tema sin barra de acción
HomeActivity o DashBoard Activity: utiliza el tema sin barra de acción. Aquí necesita el cajón de navegación, también todas las pantallas que siguen serán fragmentos o fragmentos anidados, hasta la vista de hoja, con el cajón compartido. Todos los ajustes, perfil de usuario, etc. estarán aquí como fragmentos, en esta actividad. Los fragmentos aquí no se agregarán a la pila posterior y se abrirán desde los elementos del menú del cajón. En el caso de fragmentos que requieren el botón de retroceso en lugar del cajón, hay un cuarto tipo de actividad a continuación.
Actividad sin cajón. Esta actividad tiene un botón de retroceso en la parte superior y los fragmentos en el interior compartirán la misma barra de acción. Estos fragmentos se agregarán al back-stack, ya que habrá un historial de navegación.
[Para más información, consulte: https://stackoverflow.com/a/51100507/787399 ]
Feliz codificación !!
fuente
Actualice este código en baseactivity. y no olvide incluir drawer_list_header en su actividad xml.
y no use request () en su actividad. pero aún así el cajón no es visible al hacer clic en la imagen ... y al arrastrarlo será visible sin elementos de la lista. Lo intenté mucho pero no tuve éxito. Necesito algunos entrenamientos para esto ...
fuente
Con la respuesta de @Kevin van Mierlo, también es capaz de implementar varios cajones. Por ejemplo, el menú predeterminado ubicado en el lado izquierdo (inicio) y otro menú opcional, ubicado en el lado derecho, que solo se muestra cuando se cargan fragmentos determinados.
He podido hacer eso.
fuente
use esto para su toolbar.xml
use esto para el encabezado de navegación si desea usar
fuente
Lo hago en Kotlin así:
Las actividades para el cajón deben heredar esto
BaseAppCompatActivity
, llamarsuper.onCreate
después de configurar el contenido (en realidad, se puede mover a algún método init) y tener elementos correspondientes para los identificadores en su diseñofuente
Mi respuesta es solo conceptual sin ningún código fuente. Puede ser útil para algunos lectores como yo entender.
Depende de su enfoque inicial de cómo diseña su aplicación. Básicamente hay dos enfoques.
Crea una actividad (actividad base) y todas las demás vistas y pantallas serán fragmentos. Esa actividad base contiene la implementación de los diseños de cajones y coordinadores. En realidad, es mi forma preferida de hacerlo porque tener pequeños fragmentos autocontenidos facilitará y facilitará el desarrollo de aplicaciones.
Si ha comenzado el desarrollo de su aplicación con actividades, una para cada pantalla, probablemente creará una actividad base, y todas las demás actividades se extenderán a partir de ella. La actividad base contendrá el código para la implementación del cajón y del coordinador. Cualquier actividad que requiera la implementación del cajón puede extenderse desde la actividad base.
Personalmente, preferiría evitar usar fragmentos y actividades mezcladas sin ninguna organización. Eso hace que el desarrollo sea más difícil y te atasque eventualmente. Si lo ha hecho, refactorice su código.
fuente
Crea un cajón de navegación en tu MainActivity usando un fragmento.
Inicialice el cajón de navegación en MainActivity
ahora en todas las demás actividades que desee usar el mismo cajón de navegación, ponga DrawerLayout como base y fragmente como cajón de navegación. Simplemente configure android: name en su fragmento apuntando a su fragmento de archivo Java. No necesitará inicializar el fragmento en otras actividades.
Puede acceder a Nav Drawer deslizando el dedo en otras actividades como en la aplicación Google Play Store
fuente