Android: NavigationDrawer / mehrere Aktivitäten / gleiches Menü

9

Was ich versuche zu tun, ist ein NavigationDrawer-Menü wie folgt: NavigationDrawer

Ich habe herausgefunden, wie man Layouts ändert, wenn man auf Menüpunkte klickt, aber wie lade ich eine neue Aktivität, ohne das Menü zu verlieren?

Meine Hauptfrage:

Nehmen wir beispielsweise an, eine meiner Menüoptionen führt Sie zu einem Layout, in dem einige Schaltflächen etwas bewirken. Ich muss eine begleitende Aktivität / Klasse laden, die die Aktionen und Funktionen dieser bestimmten "Seite" in der App behandelt. Wenn eine andere Menüoption zu einem Layout mit nur einem Bild führt, wäre dies beispielsweise eine weitere Aktivität ohne den gesamten Code, der die Funktionalität der Schaltflächen übernimmt, da auf diesem Bildschirm keine Schaltflächen vorhanden sind.

Ich hoffe, das ergibt Sinn! Ich habe viele Tutorials / Videos online mit verschiedenen Methoden (Fragmenten etc.) verfolgt, aber nichts hat meine Frage beantwortet.

    
L. Zan 18.03.2016, 23:04
quelle

3 Antworten

20

Nach meinem Verständnis soll die Navigationsleiste in jeder Aktivität vorhanden sein. Es gibt zwei Methoden:

  1. Verwenden Sie @ Russells Antwort. Machen Sie eine Hauptaktivität mit einem Framelayout, das normalerweise als content_frame bezeichnet wird und die gesamte Aktivität abdeckt. Diese Aktivität hat den Code für die Navigationsleiste. Auf Knopfdruck können Sie den Inhalt dieses Layouts durch das Layout des gewünschten Fragments ersetzen (d. H. Entweder ein Fragment mit mehreren Schaltflächen oder ein Bild sagen). Die Elemente in der Schublade sind also alle Fragmente. In den Tutorials werden die Fragmente über getFragmentManager () aufgerufen. Schau dir die Video-Serie in der Navigationsschublade von diesen Leuten an, slidererd: Ссылка . Versuche es zu implementieren, während du dem Video folgst

  2. Ich persönlich bevorzuge diese Methode, aber sie hat ihre Grenzen. Erstellen Sie eine Basisaktivität, in der sich der Code für die Navigationsleiste befindet. Dies hat ein Framelayout, das üblicherweise als content_frame bezeichnet wird und die gesamte Aktivität abdeckt. Die Aktivitäten, die die Schublade haben müssen, erweitern diese Basisaktivität anstelle von App-Kompaktivität oder Aktivität. Die Layout-Inflation funktioniert im oncreate wie folgt: getLayoutInflater().inflate(R.layout.activity_this, contentFrameLayout); statt setContentView . Hier werden die Aktivitäten durch startActivity gestartet. Nachteile dieser Methode: a) Die BaseActivity wird jedes Mal zerstört und neu erstellt, wenn der Benutzer die Aktivität ändert. b) Die Aktivität kann nur eine Klasse erweitern, die standardmäßig zu baseActivity Pros wird: a) Sie können einen Aktivitätsstapel verwalten b) Jede Aktivität kann eigene Konfigurationsänderungsregeln und onsaveInstance-Regeln haben. c) Diese Aktivitäten können getrennte Fragmente haben, die diese Aktivität für die Kommunikation verwenden. Der Versuch, dies in der ersten Methode zu tun, würde bedeuten, dass die Hauptaktivität eine große Anzahl von Schnittstellen unnötig implementiert (Sie werden über Schnittstellen in der Interfragment-Kommunikation lernen)

suku 19.03.2016, 00:10
quelle
33

Dank der obigen Antworten war ich in der Lage, genau das zu tun, was ich wollte. Hier ist genau das, was ich getan habe, wenn jemand in Zukunft danach gesucht hat:

Meine activity_main.xml sieht so aus:

%Vor%

Dies ist das Standard-DrawerLayout, das alle Teile für das NavigationDrawer-Menü zusammenfasst. Die wichtige Ergänzung dazu ist das FrameLayout ... Bit, dem ich die ID content_frame gegeben habe. Hier werden alle anderen von anderen Aktivitäten verwendeten Layouts verschoben / hinzugefügt / aufgeblasen.

Meine BaseActivity.java sieht folgendermaßen aus:

%Vor%

Jetzt gibt es innerhalb der onNavigationItemSelected-Methode eine switch-Anweisung, die behandelt, was passiert, wenn jedes Menüelement ausgewählt wird. Dies ist das wichtige Teil:

%Vor%

Sie müssen "TheClassYouWantToLoad" durch Ihre eigene Klasse ersetzen. Nun benötigen Sie innerhalb dieser neuen Klasse (für die vermutlich einige neue UI-Elemente geladen werden müssen) Folgendes:

%Vor%

und ersetzen Sie "the_layout_you_want_to_load" durch den Namen des Layouts, das Sie laden möchten.

    
L. Zan 19.03.2016 14:45
quelle
1

Wenn Sie eine neue Aktivität starten, verlieren Sie Ihr Menü, da die neue Aktivität die alte Aktivität abdeckt. Sie müssen dafür Fragmente verwenden. Stellen Sie sich Fragmente als Aktivitäten vor, die in einer anderen Aktivität leben können.

Verwenden Sie Fragmente, aber fügen Sie Ihre Benutzeroberflächenelemente dem Aktivitätslayout außerhalb von FrameLayout (id: content_frame) hinzu. Wenn Sie dann auf einen Menüeintrag klicken, wirkt sich Ihre Fragmenttransaktion nur auf das content_frame-FrameLayout aus und lässt alle anderen Layoutelemente unverändert Ort.

Bleib dran, Kumpel, es wird nur klarer von hier ... bis du die nächste Wand triffst: D

Ich schlage dieses Tutorial vor: Ссылка

Und dieses Material: Ссылка

    
Russell Elfenbein 18.03.2016 23:27
quelle