2017-02-06 3 views
1

ich versuchte, zwischen zwei Fragmente zu kommunizieren, aber ich bin nur ein Anfänger, so ich möchte wissen, ob es eine Lösung nicht mit interface ist ....Kommunikation zwischen Fragmente ohne Interface Über

Wenn Fragment sind A, B, und ihre Aktivität:

  1. Senden Werte von Fragment A an Aktivität (hier drin Fragment A ist ein aktueller Zustand)
  2. Werte von Aktivität Senden an Fragment B

Ich weiß, direkte Kommunikation zwischen zwei Fragmenten ist fast unmöglich, , aber ich glaube nicht, dass mich eine interface macht.

Gibt es auch eine Methode wie putExtra() für Fragment zu verwenden? Ich kenne nur Serializable.

+1

gibt es Dritten Libs, die als EventBus wirken kann. wenn ihr interessiert ist green robots eventbus. Wenn Sie rxjava verwenden, stehen viele Bibliotheken zur Verfügung, die als Eventbus fungieren. Die Android-Docs empfiehlt die Schnittstelle. – Raghunandan

Antwort

0

Sie eine Methode aus der übergeordneten Aktivitätsklasse aufrufen kann, das ein Verfahren von Fragment B nennt wie ((YourActivity)getActivity()).callMethod(T yourData)

+0

Aber ist 'getActivity' Backstack nicht erhöht? – TheUser

+0

Es gibt kein Backstacking. Ihre Aktivität ist ein Container für Ihre Fragmente, so dass es ein Medium sein kann, über das Sie Daten übertragen können. Natürlich müssen Sie sicherstellen, dass Ihre Fragmente in einem ordnungsgemäßen Zustand sind, während Sie Daten für z. B. mit Daten empfangen. isAdded() Methode – dhian

1

Sie zwischen den Fragmenten unter Verwendung EventBus direkt miteinander kommunizieren können - normale oder klebrigen Ereignisse durch ein Fragment senden und zu diesem Ereignis abonnieren in einem anderen. Wenn keine Nachrichten verloren gehen sollen, verwenden Sie klebrige Ereignisse - dies funktioniert in Android als Sticky Intent. Es wird in der Nähe sein, bis es durch ein Targer-Fragment entfernt wird oder weil ein anderes Ereignis ansteht.

1

Haben Sie einen Blick auf die Android deverlopers Seite: http://developer.android.com/training/basics/fragments/communicating.html#DefineInterface

Grundsätzlich Sie eine Schnittstelle in Ihrem Fragment A definieren und Ihre Aktivität lassen implementieren diese Schnittstelle. Jetzt können Sie die Schnittstellenmethode in Ihrem Fragment aufrufen, und Ihre Aktivität erhält das Ereignis. Jetzt in Ihrer Tätigkeit, können Sie Ihr zweites Fragment rufen Sie die Textview mit dem empfangenen Wert

// You Activity implements your interface 
    public class YourActivity implements FragmentA.TextClicked{ 
@Override 
public void sendText(String text){ 
    // Get Fragment B 
    FraB frag = (FragB) 
     getSupportFragmentManager().findFragmentById(R.id.fragment_b); 
    frag.updateText(text); 
    } 
} 


// Fragment A defines an Interface, and calls the method when needed 
public class FragA extends Fragment{ 

TextClicked mCallback; 

public interface TextClicked{ 
    public void sendText(String text); 
} 

@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 

    // This makes sure that the container activity has implemented 
    // the callback interface. If not, it throws an exception 
    try { 
     mCallback = (TextClicked) activity; 
    } catch (ClassCastException e) { 
     throw new ClassCastException(activity.toString() 
      + " must implement TextClicked"); 
    } 
} 

public void someMethod(){ 
    mCallback.sendText("YOUR TEXT"); 
} 

@Override 
public void onDetach() { 
    mCallback = null; // => avoid leaking, thanks @Deepscorn 
    super.onDetach(); 
    } 
    } 

    // Fragment B has a public method to do something with the text 
public class FragB extends Fragment{ 

public void updateText(String text){ 
    // Here you have it 
    } 
} 
0

Ja, Sie übertragen Daten zwischen den Fragmenten aktualisieren können bundle mit, wie Sie in Aktivität zu tun mit putExtra

 Bundle = bundle = new Bundle(); 
     bundle.putString("key","value"); 
     bundle.putSerializable("serialzedKey",SerializedValue); 
     FragmentTransaction fts = ((BaseActivity) mContext).getSupportFragmentManager().beginTransaction(); 
     fragment.setArguments(bundle); 
     fts.add(R.id.fragmentHolder, fragment); 
     fts.addToBackStack(fragment.getClass().getSimpleName()); 
     fts.commit(); 

In andere Fragment können Sie Daten abrufen, indem

String key = getArguments().getString("key"); 
SerializedModel = getArguments().getSerializable("serialzedKey"); 
Verwandte Themen