2013-07-23 11 views
27

Ho una barra di navigazione senza alcuna barra di azione (non voglio una barra di azione). Sto cercando di farlo in modo da avere un pulsante in grado di aprire il cassetto di navigazione.Come aprire Navigation Drawer senza barra delle azioni, aprire con un solo pulsante

io ci so un metodo chiamato openDrawer per la DrawerLayout http://developer.android.com/reference/android/support/v4/widget/DrawerLayout.html#openDrawer(android.view.View)

non sapevo come usarlo, ma ho provato a fare un pulsante quando scatto, corre questo metodo:

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

Quando lo clicco su di esso, mi dà una NullPointerException Java. Qualcuno ha qualche idea?

MODIFICA: Questo codice si trova all'interno di un frammento e sto cercando di riferire il layout del cassetto al di fuori del frammento. Ho usato il debugger e mostra che mDrawlerLayout è NULL.

Qualche consiglio?

Grazie!

+0

Aggiunta una modifica. – CynthiaDDurazo

risposta

42

Fornisce un puntatore nullo perché si sta cercando di trovare il layout del cassetto nella vista del frammento, quando si trova effettivamente nella vista delle attività.

Un hack veloce per fare quello che vuoi è quello di trovare la vista come:

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

che dovrebbe funzionare. Un modo migliore è quello di avere un metodo sull'attività di apertura del cassetto

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

Nell'attività onCreate eseguire il findViewById:

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

mDrawerLayout dovrebbe essere una variabile membro della vostra attività.

Poi, nel tuo frammento si può chiamare:

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

Un modo ancora migliore per farlo è quello di creare un ascoltatore nel frammento e impostare l'attività come ascoltatore al frammento. Quindi puoi chiamare un metodo sull'attività, come sopra. Ti lascerò fare delle ricerche su come farlo.

+0

Grazie, hai chiarito molte cose per me. – CynthiaDDurazo

+12

Ho dovuto usare 'mDrawerLayout.openDrawer (Gravity.LEFT);' nel metodo 'openDrawer' per farlo funzionare. (Sto usando il cassetto di navigazione senza entrambi i frammenti e la barra delle azioni) Altrimenti, si blocca semplicemente l'app. –

+0

È possibile rimuovere l'icona predefinita? In quella posizione voglio usare un menu opzioni diverso. – JCarlos

28

drawerLayout.openDrawer(Gravity.START);

0

ho scritto una risposta su questo qui: 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; 
     }); 

È direttamente ottenere il cassetto corrente all'interno di una vista/fragement in modo che non sarà possibile ottenere un NullPointerException

0

Funziona con un clic del pulsante

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

      drawer.openDrawer(GravityCompat.START); 

     } 
    }); 
1

Grazie a @athor & @Ashish Tana.

Mi ci è voluto così tanto tempo per capire l'errore (NullPointerException) che sto ottenendo.

Il mio funziona in questo modo; Invece di getView(), utilizzo getActivity() e apro il cassetto 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

questo davvero lavoro metto questo onCreate (Bundle savedInstanceState) { super.onCreate (savedInstanceState); // inserisci qui il codice } – Faisal

Problemi correlati