2013-09-01 4 views
23

Próbowałem wyszukiwać, ale wciąż jestem trochę zagubiony. Zwykle przesyłam fragmenty do fragmentów za pośrednictwem interfejsu Activity za pośrednictwem interfejsów lub BroadcastReceiver.Android - getTargetFragment i setTargetFragment - do czego są używane

W każdym razie, moim pytaniem jest, jaki jest pożytek z getTargetFragment? Czy ktoś może podać przypadek użycia lub tylko krótki przykład, aby zrozumieć jego użycie?

+1

http://stackoverflow.com/a/13733914/1096668 tutaj jest inny dobry przykład ... ale interfejsy są również dobre. –

+0

Dzięki ... wygląda jak zwykły uchwyt na fragment. więc jeśli mam fragment i i setTarget, to mogę użyć getTarget do pobrania fragmentu. Jest podobny do setTag w widokach. – j2emanue

+1

Zamiast BroadcastReceiver, rozważ użycie LocalBroadcastManager (tutaj: http://developer.android.com/reference/android/support/v4/content/LocalBroadcastManager.html) lub utwórz własny mechanizm obsługi zdarzeń. –

Odpowiedz

27

Przypadek użycia = 2 fragmenty obsługiwane przez tę samą aktywność.

Gdzie startActivityForResult() ustanawia związek między 2 czynnościami, setTargetFragment() definiuje związek wywołujący/wywoływany między 2 fragmentami.

setTargetFragment (target) pozwala "wezwanemu" fragmentowi wiedzieć, gdzie wysłać wynik. onActivityResult() jest wywoływany ręcznie w tym przypadku.

public class Caller extends Fragment 
    Fragment called = Called.newInstance() 
    called.setTargetFragment(this) 

public class Called extends DialogFragment 
    intent = amazingData 
    getTargetFragment().onActivityResult(getTargetRequestCode(), resultCode, intent) 
4

Z tego, co udało mi się oderwać od czytania dokumentów, wynikało, że te metody są innym sposobem uzyskiwania dostępu do danych z innego fragmentu. Oto sample project, który napisałem, demonstrujący pojedynczy przypadek użycia tych metod. Jestem pewien, że jest więcej przypadków użycia ...

+0

@ j2emanue jakiej części nie dostajesz? –

4

W końcu dowiedziałem się, jak używać setTarget w fragmencie i chciałbym się nim dzielić. jest to bardzo przydatne, gdy chcesz komunikować się z fragmentu do fragmentu.

Oto przykład: powiedzmy, że chcesz wyświetlić okno dialogowe, a kiedy zostanie zamknięte, chcesz wykonać pewne działanie.

więc w fragment1 że użyje okno można to zrobić:

myDialogFragment.setTargetFragment(fragment1, myDialogFragment.REQ_CODE); 

iw swoim fragmencie, który wywołał dialog, czego potrzeba, aby zastąpić onActivityResults tak:

@Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if(requestCode == CoDDialogFragment.REQ_CODE) 
      exit(); //or whatever you want to do here 
    } 

i w myDialogFragment można to zrobić:

TellTargetYouGotResults(REQ_CODE); 

//... 
    private void TellTargetYouGotResults(int code) { 
     Fragment targetFragment = getTargetFragment(); // fragment1 in our case 
     if (targetFragment != null) { 
      targetFragment.onActivityResult(getTargetRequestCode(), code, null); 
     } 
    } 

gdzie REQ_CO DE może być dowolną int oczywiście. Bardzo przydatne do komunikacji między fragmentami. ale nadal wolę magistralę zdarzeń, ponieważ czasami po wysłaniu danych do celu jego widok mógł już zostać zniszczony (po prostu fragment), a jeśli spróbujesz zaktualizować widok w trybie onActivityResult, dostaniesz awarię. więc powiedziałbym, że warto przesyłać dane wzdłuż, ale nie aktualizować interfejsu użytkownika, chyba że dokonano "fragmentu" transakcji fragmentu, a nie wymiany (która niszczy widok, ale zachowuje stan).

Powiązane problemy