2016-03-27 14 views
4

Ich habe eine App mit einer Navigationsleiste und 4 Navigationspunkten (Fragmente). In einem der Fragmente habe ich ein Tab-Layout eingerichtet mit einem View-Pager (3 weitere Fragmente).Deaktivieren der Navigationsschublade von Fragment

Von einem dieser inneren Fragmente möchte ich die Navigationsleiste dynamisch deaktivieren/aktivieren. Grundsätzlich möchte ich bei einem Tastendruck den Zugriff auf die Navigationsleiste einschränken (und bei erneutem Drücken wieder aktivieren).

Wie würde ich es tun?

Ich versuchte, von diesem inneren Fragment auf die DrawerLayout der Elternaktivität zuzugreifen. Aber ich sehe keine Methoden zum Aktivieren/Deaktivieren der Navigationsleiste.

Die Art, wie ich die Schublade zu meiner Hauptaktivität hinzugefügt habe.

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
setSupportActionBar(toolbar); 

DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
toggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); 
drawer.setDrawerListener(toggle); 

NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); 
navigationView.setNavigationItemSelectedListener(this); 

(und natürlich habe ich toggle.syncState() aus der onPostCreate Methode hinzugefügt

+0

Verwenden Sie 'setDrawerLockMode()' für 'DrawerLayout' und' setDrawerIndicatorEnabled() 'für' ActionBarDrawerToggle'. –

+0

@MikeM. Das Setzen von 'setDrawerLockMode()' hat die Wischgeste gestoppt. Um 'setDrawerIndicatorEnabled()' zu setzen, wie kann ich innerhalb meines Fragments auf 'ActionBarDrawerToggle' zugreifen? – Roshnal

+0

Im Idealfall sollten Sie dies über eine "Schnittstelle" ausführen, die die Aktivität implementiert, wobei die Methode "interface" in der Aktivität die oben genannten Methoden aufruft. –

Antwort

23

Eine saubere Art und Weise, dies zu tun ist . einen interface, dass der Activity implementiert, durch denen die Fragment nennen kann ein Verfahren lokal auf die Activity, die die Schublade Verschlusshebel und wechseln Tastenzustände zum Beispiel zu erstellen:

public interface DrawerLocker { 
    public void setDrawerEnabled(boolean enabled); 
} 

In dem Activity ‚s interface Methode, Abbildung wir einfach den konstanten Sperrmodus für den DrawerLayout#setDrawerLockMode() Anruf und setDrawerIndicatorEnabled() auf den ActionBarDrawerToggle nennen.

public class MainActivity extends Activity implements DrawerLocker { 

    public void setDrawerEnabled(boolean enabled) { 
     int lockMode = enabled ? DrawerLayout.LOCK_MODE_UNLOCKED : 
           DrawerLayout.LOCK_MODE_LOCKED_CLOSED; 
     drawer.setDrawerLockMode(lockMode); 
     toggle.setDrawerIndicatorEnabled(enabled); 
    } 

    ... 
} 

Im Fragment, brauchen wir nur die Hosting-Activity zum interface, und rufen Sie die setDrawerEnabled() Verfahren entsprechend zu werfen. Um zum Beispiel der Schublade sperren:

((DrawerLocker) getActivity()).setDrawerEnabled(false); 

NB: Seit der Version 23.2.0 der v7 appcompat Support-Bibliothek, ActionBarDrawerToggle Hinsicht der DrawerLayout ‚s Lock-Modus, und die Schublade Zustand nicht wechseln, wenn es ist verschlossen. Dies bedeutet, dass es nicht unbedingt notwendig ist, setDrawerIndicatorEnabled() zu verwenden, obwohl es wünschenswert sein könnte, dies immer noch zu tun, um dem Benutzer eine visuelle Anzeige zu liefern, dass der Schalter deaktiviert ist.

Verwandte Themen