2013-07-23 5 views
27

Ich habe eine Navigationsleiste ohne Aktionsleiste (Ich möchte keine Aktionsleiste). Ich versuche es so zu machen, dass ich einen Knopf habe, der die Navigationsschublade öffnen kann.So öffnen Sie die Navigationsschublade ohne Aktionsleiste, öffnen Sie mit nur einer Taste

ich weiß, gibt es eine Methode namens openDrawer für die DrawerLayout http://developer.android.com/reference/android/support/v4/widget/DrawerLayout.html#openDrawer(android.view.View)

Ich weiß nicht, wie es zu benutzen, aber ich habe versucht, eine Schaltfläche, wenn Klick machen läuft diese Methode:

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

Wenn ich darauf klicke, bekomme ich eine Java NullPointerException. Hat jemand eine Idee?

EDIT: Dieser Code ist in einem Fragment, und ich versuche, diese Schublade Layout außerhalb des Fragments beziehen. Ich habe Debugger verwendet, und es zeigt, dass mDrawlerLayout NULL ist.

Irgendwelche Ratschläge?

Danke!

+0

Gerade hinzugefügt eine Bearbeitung. – CynthiaDDurazo

Antwort

42

Es gibt Ihnen einen Nullzeiger, weil Sie versuchen, das Schubladenlayout in der Ansicht des Fragments zu finden, wenn es sich tatsächlich in der Aktivitätenansicht befindet.

Eine schnelle Hack zu tun, was Sie wollen, ist die Ansicht zu finden wie:

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

Das sollte funktionieren. Eine bessere Möglichkeit ist zum Öffnen der Schublade

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

in der Aktivität, ein Verfahren auf die Aktivität haben onCreate Ihre findViewById laufen:

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

mDrawerLayout eine Membervariable Ihrer Tätigkeit sein sollte.

Dann in Ihrem Fragmente können Sie anrufen:

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

Ein noch besserer Weg, es zu tun sind, einen Zuhörer im Fragmente und stellen Sie die Aktivität als Zuhörer an das Fragment zu erstellen. Dann können Sie ähnlich wie oben eine Methode für die Aktivität aufrufen. Ich werde dich untersuchen lassen, wie das geht.

+0

Danke, du hast eine Menge Dinge für mich geklärt. – CynthiaDDurazo

+12

Ich musste 'mDrawerLayout.openDrawer (Gravity.LEFT);' in 'openDrawer' Methode verwenden, damit es funktioniert. (Ich benutze Navigationsschublade ohne beide Fragmente & Aktionsleiste) Ansonsten hängt es einfach die App. –

+0

Ist es möglich, das Standardsymbol zu entfernen? In dieser Position möchte ich ein anderes Optionsmenü verwenden. – JCarlos

28

drawerLayout.openDrawer(Gravity.START);

0

Ich schrieb eine Antwort dazu hier: 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; 
     }); 

Sie direkt die aktuelle Schublade in einer Ansicht/Bruchstück bekommen, so dass Sie keine Nullpointer

bekommen
0

Es funktioniert auf Schaltfläche klicken

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

      drawer.openDrawer(GravityCompat.START); 

     } 
    }); 
1

Dank @athor & @Ashish Tana.

Ich brauchte so viel Zeit, um den Fehler herauszufinden (NullPointerException) Ich bekomme.

Mine arbeitet auf diese Weise; Anstatt getView() benutze ich getActivity() und öffne die Schublade durch 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); 
      } 
     }); 
+0

das wirklich Arbeit, die ich diese onCreate setzen (Bundle savedInstanceState) { super.onCreate (savedInstanceState); // Platzieren Sie den Code hier } – Faisal