web-dev-qa-db-fra.com

Comment ouvrir le tiroir de navigation sans barre d'action, ouvrir avec juste un bouton

J'ai une barre de navigation sans barre d'action (je ne veux pas de barre d'action). J'essaie de faire en sorte que j'ai un bouton qui peut ouvrir le tiroir de navigation.

Je sais qu'il existe une méthode appelée openDrawer pour le DrawerLayout http://developer.Android.com/reference/Android/support/v4/widget/DrawerLayout.html#openDrawer (Android.view.View)

Je ne savais pas comment l'utiliser, mais j'ai essayé de créer un bouton lorsque vous cliquez, exécute cette méthode:

DrawerLayout mDrawerLayout = (DrawerLayout) getView().findViewById(R.id.drawer_layout);
mDrawerLayout.openDrawer(mDrawerLayout);

Lorsque je clique dessus, cela me donne une Java NullPointerException. Quelqu'un a-t-il une idée?

EDIT: Ce code est à l'intérieur d'un fragment, et j'essaie de référencer la disposition de ces tiroirs à l'extérieur du fragment. J'ai utilisé le débogueur, et cela montre que mDrawlerLayout est NULL.

Aucun conseil?

Merci!

35
CynthiaDDurazo

Cela vous donne un pointeur nul parce que vous essayez de trouver la disposition du tiroir dans la vue du fragment, alors qu'elle est en fait dans la vue des activités.

Un hack rapide pour faire ce que vous voulez est de trouver la vue comme:

getActivity().findViewById(R.id.drawer_layout)

Cela devrait fonctionner. Une meilleure façon est d'avoir une méthode sur l'activité pour ouvrir le tiroir

public void openDrawer(){
    mDrawerLayout.openDrawer(mDrawerLayout);
}

Dans l'activité onCreate, exécutez votre findViewById:

mDrawerLayout = (DrawerLayout) getView().findViewById(R.id.drawer_layout);

mDrawerLayout doit être une variable membre de votre activité.

Ensuite, dans votre fragment, vous pouvez appeler:

//cast activity to MyActivity so compiler doesn't complain
((MyActivity)getActivity()).openDrawer();

Une façon encore meilleure de le faire consiste à créer un écouteur dans le fragment et à définir l'activité en tant qu'écouteur sur le fragment. Ensuite, vous pouvez appeler une méthode sur l'activité, similaire à celle ci-dessus. Je vous laisse faire des recherches sur la façon de procéder.

52
athor
drawerLayout.openDrawer(Gravity.START);
36
Aliya

Merci à @athor et @Ashish Tana.

Il m'a fallu tellement de temps pour comprendre l'erreur (NullPointerException) que j'obtiens.

Le mien fonctionne de cette façon; Au lieu de getView(), j'utilise getActivity() et ouvre le tiroir par mDrawerLayout.openDrawer(Gravity.LEFT);.

mDrawerLayout = (DrawerLayout) getActivity().findViewById(R.id.drawer_layout);
final ImageButton btnOpenDrawer = (ImageButton) getView().findViewById(R.id.drawer_menu);

        btnOpenDrawer.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mDrawerLayout.openDrawer(Gravity.LEFT);
            }
        });
2
Jei

J'ai une solution plus simple qui utilise isDrawerOpen() de DrawerLayout.

Le code ci-dessous ferme ou ouvre le tiroir de navigation en fonction de l'état actuel du tiroir (ouvert/fermé)

Button hamMenu = findViewById(R.id.ham_menu);
hamMenu.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        DrawerLayout navDrawer = findViewById(R.id.drawer_layout);
        // If navigation drawer is not open yet, open it else close it.
        if(!navDrawer.isDrawerOpen(GravityCompat.START)) navDrawer.openDrawer(Gravity.START);
        else navDrawer.closeDrawer(Gravity.END);
    }
});
2
Sapnesh Naik

Cela fonctionne sur le clic du bouton

mButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            drawer.openDrawer(GravityCompat.START);

        }
    });
0

J'ai écrit une réponse à ce sujet ici: https://stackoverflow.com/a/18199771/880349

   //For me a better way in avoiding a `null pointer` in getting the DrawerLayout
   final DrawerLayout drawer = (DrawerLayout) getActivity().findViewById(R.id.drawer_layout);
   btn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                            //Opens the Drawer
                drawer.openDrawer(Your View, Usually a ListView);
            }

                return false;
        });

Vous obtenez directement le tiroir actuel dans une vue/gestion afin de ne pas avoir d'exception NullPointerException

0
rahstame