2014-04-30 23 views
15

Betrachten wir einen Fall, wo ich Fragment A und Fragment B haben.Übergeben Schnittstelle zu Fragment

B erklärt:

public interface MyInterface { 
    public void onTrigger(int position); 
} 

A diese Schnittstelle implementiert.

Wenn Fragment B in Stapel schieben, wie soll ich anhand von Fragment A es in Bundle geben, so kann A den onTrigger Rückruf erhalten, wenn nötig.

Mein Use Case-Szenario ist, dass A hat ListView mit Gegenständen und B hat ViewPager mit Gegenständen. Beide enthalten die gleichen Elemente, und wenn der Benutzer von B -> A geht, bevor er B knallt, sollte er den Rückruf für A auslösen, um seine ListView Position zu aktualisieren, um mit B Pagerposition übereinzustimmen.

Danke.

Antwort

16
Passing interface to Fragment 

Ich glaube, Sie zwischen zwei Fragment

Um kommunizieren, dies zu tun, können Sie einen Blick in Communicating with Other Fragments

public class FragmentB extends Fragment{ 
    MyInterface mCallback; 

    // Container Activity must implement this interface 
    public interface MyInterface { 
     public void onTrigger(); 
    } 

    @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 = (MyInterface) activity; 
     } catch (ClassCastException e) { 
      throw new ClassCastException(activity.toString() 
        + " must implement MyInterface "); 
     } 
    } 

    ... 
} 
+3

Aber meine Aktivität hat nichts mit den zwei Fragmenten zu tun, die kommunizieren wollen, gibt es keine andere Lösung? – Niko

+0

@ Niko können Sie etwas mehr mit einer Benutzeroberfläche erklären. Damit ich dir helfen kann. –

+0

Meine Frage wurde mit dem Anwendungsfall aktualisiert. – Niko

1

Mit @ Amit Antwort haben kann, und die Anpassung an die Frage OPs , hier ist der relevante Code:

public class FragmentA extends BaseFragment implements MyInterface { 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

     // THIS IS JUST AN EXAMPLE OF WHERE YOU MIGHT CREATE FragmentB 
     FragmentB myFragmentB = new FragmentB();   
    } 


    void onTrigger(int position){ 
     // My Callback Happens Here! 
    } 
} 

...

public class FragmentB extends BaseFragment { 

    private MyInterface callback; 

    public interface MyInterface { 
     void onTrigger(int position); 
    } 

    @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 { 
      callback = (MyInterface) activity; 
     } catch (ClassCastException e) { 
      throw new ClassCastException(activity.toString() + " must implement MyInterface"); 
     } 
    } 
} 
+0

zu vervollständigen. Hab das selbe aber nicht den Callback in Fragment A bekommen, aber ich habe den Callback in Activity bekommen. –

2

Für Kotlin 1.0.0-beta-3595

interface SomeCallback {} 

class SomeFragment() : Fragment(){ 

    var callback : SomeCallback? = null //some might want late init, but I think this way is safer 

    override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? { 
     callback = activity as? SomeCallback //returns null if not type 'SomeCallback' 

     return inflater!!.inflate(R.layout.frag_some_view, container, false); 
    } 
} 
1

Es ist optimal für zwei Fragmente zu nur durch eine Aktivität in Verbindung stehen. Sie können also in Fragment B eine Schnittstelle definieren, die in der Aktivität implementiert ist. Dann in der Aktivität definiert in der Interface-Methode, was Sie in Fragmente A passieren sollen

In Fragmente B,

MyInterface mCallback; 
public interface MyInterface { 
     void onTrigger(int position); 
    } 

@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 = (MyInterface) activity; 
     } catch (ClassCastException e) { 
      throw new ClassCastException(activity.toString() 
        + " must implement MyInterface"); 
     } 
} 

Verfahren zur Bestimmung, ob Benutzer von B nach A

gehen
public void onChangeFragment(int position){ 
//other logic here 
mCallback.onTrigger(position); 
} 

In Aktivität,

public void onTrigger(int position) { 
    //Find listview in fragment A 
    listView.smoothScrollToPosition(position); 
    } 

Goodluck!

Verwandte Themen