2016-04-05 12 views
6

Ich habe eine Activity und 5 Fragment 's. Auf der ersten Fragment Benutzereingaben Telefonnummer. Auf der letzten (fünften) Fragment muss ich diese Telefonnummer anzeigen, andere Felder eingeben und alle Daten an den Server senden. Für jede verwende ich separate Presenter (MVP).Android Pass Daten zwischen den Fragmenten

Wie Daten vom ersten Fragment an die letzte weitergegeben werden?

1) Ich möchte nicht alle Ketten von Fragmenten durchlaufen, weil sie diese Daten nicht benötigen.

2) Wenn diese Daten im Hosting Activity speichern, dann muss ich ((SomeActivity)getActivity()).getUserData() innerhalb Fragment Klasse aufrufen und diese Daten an Presenter übergeben.

3) Ich wählte den letzten Ansatz. Ich habe Singleton UserData Klasse erstellt. Dies ist eine einfache POJO-Klasse. Ich erstelle Instanz von UserData in der ersten Fragment Set benötigt Daten und dann mit der letzten Fragment, um Daten abzurufen und fehlende Felder hinzuzufügen.

Aber ich weiß nicht, ist Ansatz mit Singleton richtige Lösung. Weil ich Singleton-Instanz löschen muss, wenn Benutzer zu einem anderen Activity geht. Wenn es bessere Lösung gibt?

EDIT

Ich dachte über EventBus. Aber ich werde Daten vom Fragment an den Presenter übergeben müssen. Jetzt rufe ich UserData.getInstance() im Inneren an und erhalte Daten. Ich möchte, dass Code eleganter und auch korrekt ist. Ich frage nach Meinung von erfahreneren Entwicklern, was besser zu verwenden ist.

+0

Können Sie 'SharedPref' nicht verwenden? –

+0

@RohitArya Ich denke nicht, dass dies eine bessere Lösung ist, als Daten innerhalb der Aktivität zu halten. Ich brauche nur diese Daten an den Server zu senden, nicht für lange Zeit –

+0

Dann wäre Singleton ein guter Ansatz. –

Antwort

2

ich tun würde, es den ModellViewPresenter Weg

class CustomerModel { 
    String phoneNumber 
} 

interface ICustomerOwner { 
    CustomerModel getCustomer() 
} 

class CustomerRegistrationWorkflowActivity extends Activity implements ICustomerOwner { 
    CustomerModel getCustomer() 
    ... 
} 

class CustomerContactDataFragment // fragment1 where you edit the phone number. 

class CustomerRegistrationSummaryFragment // fragment5 showing all data plus submit button) 

Da das Modell in der (CustomerRegistrationWorkflow) Tätigkeit lebt die Fragmente könnten mit dem Modell kommunizieren durch

Aufruf
((ICustomerOwner) getActivity()).getCustomer() 
2

Es gibt so viele Möglichkeiten, Daten von einer Klasse (auch Fragmente) an eine andere zu senden.

Betrachtet Fragment Lebenszyklus Probleme. Sie können einen Event-Bus für den gleichen ohne irgendwelche Probleme verwenden.

class FragmentA { 
    Bus bus; 

    onCreate(){ 
     bus = new Bus(); 
    } 

    @Subscribe public void receiveMessage(String message) { 
     // TODO: Parse your message 
    } 

    onResume(){ 
     bus.register(this); 
    } 

    onPause(){ 
     bus.unregister(this); 
    } 
} 

class FragmentB { 

    onCreate(){ 
     bus.post("You have a message"); 
    } 
} 

Mehr über die Integration von Otto here. Oder es gibt so viele andere Möglichkeiten. https://greenrobot.github.io/EventBus/

+0

Ich dachte über EventBus nach. Aber ich habe einen Kommentar für meine Frage geschrieben. Ich werde Daten von dem "Fragment" an den Moderator weitergeben müssen. Jetzt rufe ich 'UserData.getInstance()' innerhalb der Gegenwart auf und erhalte Daten. Ich möchte Code eleganter und auch richtig –

+2

Wenn Sie etwas haben. Fügen Sie es in Ihrer Frage hinzu. Wie erwarten Sie, dass Ihre Frage und Ihre Kommentare beantwortet werden? – amalBit

+0

Ich habe meine Frage aktualisiert –

0

Ein Fragment ist immer mit der Aktivität verbunden, die es enthält. So kann es leicht mit der Aktivität kommunizieren. Wenn Sie Ihre Aktivität als Kanal für die Kommunikation oder als Medium für die Kommunikation verwenden, können Sie eine Kommunikationsverbindung zwischen den Fragmenten herstellen, die an die gleiche Aktivität angehängt sind.

Ein Fragment, das mit einer Aktivität verbunden ist, kann über die Methode getActivity() auf die Instanz der Aktivität zugreifen, und mit dieser Instanz kann Fragment Aufgaben wie das Aufrufen von Methoden der Aktivität ausführen.

Um nun Daten von einem Fragment in ein anderes zu übertragen, können Sie in der Aktivität eine Methode erstellen und über diese Methode Daten in einer Variablen speichern. Und in dem anderen Fragment können Sie dann auf den Wert dieser Variablen mit Hilfe einer anderen Methode zugreifen. Das Konzept der Getter- und Setter-Methoden kann hier verwendet werden.

Für weitere Informationen über Aktivitäten und Fragments der Kommunikation, besuchen Sie den Link: http://developer.android.com/guide/components/fragments.html#CommunicatingWithActivity

1

Man nennt elegante Lösung Ereignis-Bus, die anderen - guten alten Rückrufe. Mein Standpunkt ist die Situation der "Kette von Fragmenten" zu vermeiden - wenn ein Fragment direkt ein anderes ruft. Wenn die Aktivität den Austausch von Fragmenten vollständig behandelt, hat sie den gleichen Zugriff auf alle 5 Fragmente. Daher kann es problemlos Daten zwischen ihnen mithilfe von Rückrufen übergeben.

In diesem Fall sehen Sie keine Probleme mit MVP. Presenter verwendet Callback, um Daten an seine Ansicht zu senden (Fragment). Verwenden Sie den Rückruf, um Daten an die Aktivität zu senden. Aktivität suchen Sie dann das 5. Fragment im Fragmentmanager und aktualisieren/übergeben Sie die Daten im 5. Fragment.

Situation mit Rückruf scheint robuster als Event-Bus, aber immer noch Geschmackssache.

0

ich viel habe von Problemen über die Weitergabe der Daten an die Aktivität oder die gegenseitige Fragmentierung. Als Ergebnis ließ ich DataCache jedes Objekt irgendwo passieren.

das ist super einfaches Beispiel.

Gihub : Android DataCache

Fragment für Sender

public class FragmentA { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     String msg = "the phone number" 
     DataCache.getInstance().push(msg); 
    } 
} 

Fragment für Empfänger

public class FragmentB { 
     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 

      String msg = DataCache.getInstance().pop(String.class); 
     } 
    } 

es versuchen: D Ich hoffe, Ihnen zu helfen.