2012-02-09 19 views
29

Używam fragmentu tylko w obrębie jednej określonej aktywności nadrzędnej. Teraz zastanawiać, czy istnieją wady jeśli wywołać metody aktywności macierzystego bezpośrednio dołączony fragment jak to.Metody wywoływania z fragmentu

getActivity() someMethodInParentActivitiy()

Bardziej powszechnym rozwiązaniem byłoby zdefiniuj interfejs formalnego odsłuchiwania w fragmencie, aby oddzwonić do działania nadrzędnego, a następnie spraw, aby działanie zaimplementowało ten interfejs.

są jakieś powodów (np niezawodność lub prędkość) dlaczego użyć drugiego bardziej kompleksowe rozwiązania, a nie metody bezpośredniego połączenia z fragmentu do aktywności?

Odpowiedz

21

Nie patrz na wydajność na samym początku. Pamiętaj, że "przedwczesna optymalizacja jest źródłem wszelkiego zła". Drugie podejście jest lepsze, ponieważ twój fragment można wykorzystać w różnych działaniach. Pierwsze podejście wprowadza więcej zależności w kodzie, fragment jest zależny od typu działania. Stracisz zdolność do testowania, ponownego użycia, małego kompleksu. To może wydawać się prostsza teraz, ale w przyszłości zobaczysz ;-)

+0

Dzięki, zauważam również, że dostęp do metody działania bezpośrednio przez getActivity() nie jest tak prosty. Prawdopodobnie potrzebuję dodatkowej obsady? – Anguel

+0

Tak, do implementacji, która zawiera 'someMethodInParentActivitiy()'. Ale jak pisałem, nie jest to zalecane. – pawelzieba

+0

Właściwie to się trochę pomyliłem, ponieważ Diane Hackborn twierdzi, że używanie takich wywołań metod jest w porządku: http://markmail.org/thread/sgvnc7bjtjfbh5rx#query:+page:1+mid:6kakhwquxdigf7om+state:results – Anguel

24

dodatkowe potrzeby rzucania do zrobienia:

Activity activity123 = getActivity(); 

if(activity123 instanceof ParentActivity) { 
    ((ParentActivity) activity123).someMethodInParentActivity(); 
} 

jednak jak @pawelzieba napisał jeśli u chcą wykorzystać ten fragment w innej działalności, która prawdopodobnie tak nie będzie działać w ten sposób .. Pozdrawiam

+0

Dobra robota ........ !!! –

9

Kiedy muszę zrobić coś takiego, po prostu używam BroadcastReceiver, więc mogę nazwać to z dowolnego miejsca.

BroadcastReceiver receiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     String action = intent.getAction(); 
     if (action != null) { 
      if (action.equals("WHATEVER_ACTION")) { 
       // Do stuff 
      } 
     } 
    } 
}; 

Wtedy w moim fragmentu I będzie po prostu użyć:

activity.sendBroadcast (new Intent() setAction ("WHATEVER_ACTION").);

+1

Wygląda dla mnie jak najlepsza praktyka. Również podstawowy wzór projektu. – rwst

+0

Czy musimy też zarejestrować nadawcę w manifeście, aby wykorzystać go tylko do komunikacji między działaniem a fragmentem? – Max

Powiązane problemy