2016-11-01 7 views
0

Mein Projekt arbeitet mit einer Navigationsaktivität, die Fragmente für die einzelnen Menüseiten verwendet. Ich möchte andere Fragmente durch Klicken auf eine Schaltfläche öffnen (im Gegensatz zu einem Navigationsmenü-Symbol), aber ich kann nicht herausfinden, wie dies zu erreichen ist. Ich habe mir die folgenden Ressourcen (und mehr) angeschaut, aber ich verstehe sie nicht vollständig.Android Studio: Wechseln zwischen Fragmenten und Aktionen in Fragmenten

How can I make my button to do something in Fragments,ViewPager https://developer.android.com/training/basics/fragments/communicating.html

Außerdem würde eine Schaltfläche auch in der Haupttätigkeit auf Code aufzurufen, die die App-Leiste verwendet.

Wenn mir jemand erklären kann, wie man den gewünschten Effekt erreicht, wäre das großartig.

Antwort

0

Wenn Sie ein Fragment durch Drücken einer Schaltfläche von einem Fragment öffnen möchten, sollte der Aufruf die aktuelle Aktivität durchlaufen.

Erstellen Sie einen Rückruf zu der Aktivität und rufen Sie diesen Rückruf auf, wenn Sie die Taste drücken. Dann startet die Aktivität das zweite Fragment, wenn der Rückruf aufgerufen wird.

Auf diese Weise muss das erste Fragment nichts über das zweite Fragment wissen. Die Aktivität beschäftigt sich mit der Navigation zwischen Fragmenten in derselben Aktivität.

Ich denke, das ist die sauberste und einfachste Lösung.

edit: Ich sage im Grunde dasselbe wie der Link zu der Android-Dokumentation in der Frage geschrieben. Ich denke, das ist die beste Lösung.

0

Zur Vereinfachung: Aktivität = [A], Fragment 1 = [B] und Fragment 2 = [C]

Schritt 1: Erstellen einer Schnittstelle innen [B] genannt IOnInitiate[C]Listener und innerhalb dieser Schnittstelle ein erstellen Methode genannt void Initiate[C]();.

Schritt 2: Erstellen Sie eine private Eigenschaft innerhalb von [B] vom Typ IOnInitiate[C]Listener mit der Bezeichnung (your-prefix-convention)OnInitiate[C]Listener.

Schritt 3: Erstellen Sie eine öffentliche Methode in [B] public void SetInitiate[C]Listener(Activity activity) genannt, und wirft die activity Parameter in das Privateigentum in Schritt 2 erstellt

Schritt 4: [A] muss implementieren die Schnittstelle [B].IOnInitiate[C]Listener und die Methode public void Initiate[C](). Wenn Sie eine neue Instanz von [B] erstellen, müssen Sie die Methode aus Schritt 3 aufrufen und this für den Activity-Parameter übergeben. Andernfalls wird eine Null-Ausnahme auftreten.

Schritt 6: Wenn Sie nun [C] von [B] einleiten müssen, rufen Sie einfach die Interface-Methode aus der privaten Eigenschaft von [B] auf. Beispiel: (prefix)OnInitiate[C]Listener.Initiate[C]();

So sieht meine aus. Ich verwende C# für meine Entwicklung, so dass Ihre Syntax anders sein kann.

public class A : Activity, B.IOnInitiateCListener 
{ 
    private void InitiateB() 
    { 
     B b = new B(); 
     b.SetInitiateCListener(this); 
     b.Show(FragmentManager, "B"); 
    } 

    public void InitiateC() 
    { 
     C c = new C(); 
     c.Show(FragmentManager, "C"); 
    } 
} 

public class B : Fragment 
{ 
    public interface IOnInitiateCListener 
    { 
     void InitiateC(); 
    } 

    private IOnInitiateCListener _IOnInitiateCListener; 

    public void SetInitiateCListener(Activity activity) 
    { 
     _IOnInitiateCListener = (IOnInitiateCListener)activity; 
    } 

    private void InitiateC() 
    { 
     _IOnInitiateCListener.InitiateC(); 
    } 
} 
Verwandte Themen