J'ai créé un tiroir de navigation fonctionnel comme indiqué dans le didacticiel sur le site Web developer.android.com . Mais maintenant, je veux utiliser un tiroir de navigation, j'ai créé dans le NavigationDrawer.class pour plusieurs activités dans mon application.
Ma question est, si quelqu'un ici peut faire un petit tutoriel, qui explique comment utiliser un tiroir de navigation pour plusieurs activités.
Je l'ai lu d'abord dans ce tiroir de navigation Android Answer sur plusieurs activités
mais cela n'a pas fonctionné sur mon projet
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);
}
}
Dans cette activité, je veux avoir le tiroir de navigation, donc j'étend «NavigationDrawer» et dans certaines autres activités, je veux utiliser le même tiroir de navigation
public class SampleActivity extends NavigationDrawer {...}
Je ne sais pas quoi changer ...
Réponses:
Si vous voulez un tiroir de navigation, vous devez utiliser des fragments. J'ai suivi ce tutoriel la semaine dernière et ça marche très bien:
http://developer.android.com/training/implementing-navigation/nav-drawer.html
Vous pouvez également télécharger un exemple de code à partir de ce didacticiel, pour voir comment procéder.
Sans fragments:
Voici votre code BaseActivity:
Toutes les autres activités qui doivent avoir un tiroir de navigation doivent étendre cette activité au lieu de l'activité elle-même, par exemple:
XML
Éditer:
J'ai moi-même rencontré quelques difficultés, alors voici une solution si vous obtenez NullPointerExceptions. Dans BaseActivity, remplacez la fonction onCreate par
protected void onCreateDrawer()
. Le reste peut rester le même. Dans les activités qui étendent BaseActivity, mettez le code dans cet ordre:Cela m'a aidé à résoudre mon problème, j'espère que ça aide!
C'est ainsi que vous pouvez créer un tiroir de navigation avec plusieurs activités, si vous avez des questions, n'hésitez pas à les poser.
Modifier 2:
Comme l'a dit @GregDan, vous
BaseActivity
pouvez également remplacersetContentView()
et appeler onCreateDrawer:la source
J'ai trouvé la meilleure implémentation. C'est dans l'application Google I / O 2014 .
Ils utilisent la même approche que celle de Kevin. Si vous pouvez vous abstenir de tout ce qui n'est pas nécessaire dans l'application d'E / S, vous pouvez extraire tout ce dont vous avez besoin et Google est assuré que c'est une utilisation correcte du modèle de tiroir de navigation. Chaque activité a éventuellement un
DrawerLayout
comme sa disposition principale. La partie intéressante est de savoir comment la navigation vers d'autres écrans se fait. Il est implémentéBaseActivity
comme ceci:Cela diffère de la manière courante de remplacer le fragment actuel par une transaction de fragment. Mais l'utilisateur ne remarque aucune différence visuelle.
la source
overridePendingTransitions
.Cette réponse est donc en retard de quelques années, mais quelqu'un peut l'apprécier. Android nous a donné un nouveau widget qui facilite l'utilisation d'un tiroir de navigation avec plusieurs activités.
android.support.design.widget.NavigationView est modulaire et a sa propre disposition dans le dossier de menu. La façon dont vous l'utilisez consiste à encapsuler les dispositions xml de la manière suivante:
La disposition racine est un android.support.v4.widget.DrawerLayout qui contient deux enfants: un
<include ... />
pour la mise en page qui est en train d'être encapsulée (voir 2) et un android.support.design.widget.NavigationView.nav_header_main est juste un LinearLayout avec orientation = vertical pour l'en-tête de votre Drawar de navigation.
activity_main_drawer est un menu xml dans votre répertoire res / menu. Il peut contenir des éléments et des groupes de votre choix. Si vous utilisez la galerie AndroidStudio, l'assistant en fera une de base pour vous et vous pourrez voir quelles sont vos options.
La disposition de la barre d'application est généralement désormais un android.support.design.widget.CoordinatorLayout et cela comprendra deux enfants: un android.support.design.widget.AppBarLayout (qui contient un android.support.v7.widget.Toolbar) et un
<include ... >
pour votre contenu réel (voir 3).La mise en page du contenu peut être la mise en page souhaitée. Il s'agit de la mise en page qui contient le contenu principal de l'activité (à l'exclusion du tiroir de navigation ou de la barre d'application).
Maintenant, la chose intéressante à propos de tout cela est que vous pouvez encapsuler chaque activité dans ces deux dispositions, mais que votre NavigationView (voir l'étape 1) pointe toujours vers activity_main_drawer (ou autre). Cela signifie que vous aurez le même (*) tiroir de navigation pour toutes les activités.
la source
Manière la plus simple de réutiliser un tiroir de navigation commun parmi un groupe d'activités
app_base_layout.xml
AppBaseActivity.java
la source
AppBaseActivity
et lasetContentView
méthode par défaut devraient fonctionner.Pour quiconque cherche à faire ce que l'affiche originale demande, veuillez envisager d'utiliser des fragments à la place de ce que Kevin a dit. Voici un excellent tutoriel sur la façon de procéder:
https://github.com/codepath/android_guides/wiki/Fragment-Navigation-Drawer
Si vous choisissez d'utiliser des activités au lieu de fragments, vous allez rencontrer le problème de la recréation du tiroir de navigation à chaque fois que vous accédez à une nouvelle activité. Il en résulte un rendu laid / lent du tiroir de navigation à chaque fois.
la source
Ma suggestion est: n'utilisez pas d'activités du tout, utilisez plutôt des fragments et remplacez-les dans le conteneur (disposition linéaire par exemple) où vous montrez votre premier fragment.
Le code est disponible dans les tutoriels pour développeurs Android, il vous suffit de le personnaliser.
http://developer.android.com/training/implementing-navigation/nav-drawer.html
Il est conseillé d'utiliser de plus en plus de fragments dans votre application, et il ne devrait y avoir que quatre activités de base locales à votre application, que vous mentionnez dans votre AndroidManifest.xml en dehors des externes (FacebookActivity par exemple):
SplashActivity: n'utilise aucun fragment et utilise le thème FullScreen.
LoginSignUpActivity: Ne nécessite pas du tout NavigationDrawer, et pas de bouton de retour également, alors utilisez simplement la barre d'outils normale, mais au moins, 3 ou 4 fragments seront nécessaires. Utilise le thème sans action
Activité HomeActivity ou DashBoard: utilise un thème sans action. Ici, vous avez besoin du tiroir de navigation, tous les écrans qui suivent seront également des fragments ou des fragments imbriqués, jusqu'à la vue des feuilles, avec le tiroir partagé. Tous les paramètres, le profil utilisateur, etc. seront ici sous forme de fragments, dans cette activité. Les fragments ici ne seront pas ajoutés à la pile arrière et seront ouverts à partir des éléments du menu du tiroir. Dans le cas de fragments qui nécessitent un bouton de retour au lieu du tiroir, il y a un quatrième type d'activité ci-dessous.
Activité sans tiroir. Cette activité a un bouton de retour en haut et les fragments à l'intérieur partageront la même barre d'action. Ces fragments seront ajoutés au back-stack, car il y aura un historique de navigation.
[Pour plus d'informations, voir: https://stackoverflow.com/a/51100507/787399 ]
Codage heureux !!
la source
mettre à jour ce code dans la baseactivity. et n'oubliez pas d'inclure tiroir_list_header dans votre xml d'activité.
et n'utilisez pas request () dans votre activité. mais le tiroir n'est toujours pas visible en cliquant sur l'image ... et en le faisant glisser sera visible sans les éléments de la liste. j'ai beaucoup essayé mais sans succès. besoin de quelques séances d'entraînement pour cela ...
la source
Avec la réponse de @Kevin van Mierlo, vous êtes également capable d'implémenter plusieurs tiroirs. Par exemple, le menu par défaut situé sur le côté gauche (démarrer) et un autre menu optionnel, situé sur le côté droit, qui n'est affiché que lorsque des fragments déterminés sont chargés.
J'ai pu faire ça.
la source
utilisez ceci pour votre toolbar.xml
utilisez-le pour l'en-tête de navigation si vous souhaitez l'utiliser
la source
Je le fais à Kotlin comme ceci:
Les activités du tiroir doivent en hériter
BaseAppCompatActivity
, appelersuper.onCreate
après que le contenu est défini (en fait, peut être déplacé vers une méthode init) et avoir des éléments correspondants pour les identifiants dans leur mise en pagela source
Ma réponse est juste conceptuelle sans aucun code source. Il pourrait être utile pour certains lecteurs comme moi de comprendre.
Cela dépend de votre approche initiale sur la façon dont vous architecturez votre application. Il existe essentiellement deux approches.
Vous créez une activité (activité de base) et toutes les autres vues et écrans seront des fragments. Cette activité de base contient l'implémentation des dispositions de tiroir et de coordinateur. C'est en fait ma façon préférée de faire, car avoir de petits fragments autonomes rendra le développement d'applications plus facile et plus fluide.
Si vous avez commencé le développement de votre application avec des activités, une pour chaque écran, vous créerez probablement une activité de base et toutes les autres activités en découleront. L'activité de base contiendra le code pour la mise en œuvre du tiroir et du coordinateur. Toute activité nécessitant une implémentation de tiroir peut s'étendre à partir de l'activité de base.
Je préférerais personnellement éviter d'utiliser des fragments et des activités mixtes sans aucune organisation. Cela rend le développement plus difficile et vous bloque finalement. Si vous l'avez fait, refactorisez votre code.
la source
Créez un tiroir de navigation dans votre MainActivity à l'aide d'un fragment.
Initialisez le tiroir de navigation dans MainActivity
maintenant dans toutes les autres activités que vous souhaitez utiliser le même tiroir de navigation. Définissez simplement android: nom dans votre fragment pointant vers votre fichier Java de fragment. Vous n'aurez pas besoin d'initialiser le fragment dans d'autres activités.
Vous pouvez accéder à Nav Drawer en glissant dans d'autres activités comme dans l'application Google Play Store
la source