2012-06-05 12 views
86

Widzę w numerze , że "działanie może wywoływać metody w fragmencie przez uzyskanie odwołania do Fragmentu z FragmentManager, używając findFragmentById() lub findFragmentByTag()."Wywoływanie metody Fragment z obiektu nadrzędnego Działanie

Poniższy przykład pokazuje, jak uzyskać referencję fragmentu, ale nie w jaki sposób wywoływać określone metody w fragmencie.

Czy ktoś może dać przykład, jak to zrobić? Chciałbym wywołać konkretną metodę w Fragmentie z działania nadrzędnego. Dzięki.

Odpowiedz

159

nie dostać kwestię dokładnie jak to jest zbyt proste:

ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment); 
fragment.<specific_function_name>(); 
+9

OK, to było łatwe, dzięki (jestem zupełnie nowy w odłamkach). Teraz najtrudniejsze jest to, że nie mogę w ogóle uzyskać odniesienia do tego fragmentu. Nie jest zdefiniowany w układzie XML, więc nie mogę użyć findFragmentById().I nie jest dla mnie jasne z kodu, który śledzę (patrz wyżej), jak/gdzie fragment jest nawet tworzony. Gdyby to było, mógłbym dodać tag i użyć findFragmentByTag(). Część AccountListActivity z przykładu ma wywołanie beginTransaction(). Add(), ale na mój ślad nigdy nie jest wywoływana. To tutaj podrapuję się w głowę. Doceniam wszelkie sugestie. – gcl1

+0

Przepraszam, zapomniałem o referencji. Wzór kodu, który obserwuję, to [FragmentTabsPager] (http://developer.android.com/resources/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentTabsPager.html). Dzięki. – gcl1

+0

Sytuacja będzie inna, gdy nie masz identyfikatora ani TAG powiązanego z fragmentem. –

8

Jeśli używasz biblioteki wsparcia, będziemy chcieli zrobić coś takiego:

FragmentManager manager = getSupportFragmentManager(); 
Fragment fragment = manager.findFragmentById(R.id.my_fragment); 
fragment.myMethod(); 
66

Jeśli używania „importu android.app.Fragment,” następnie wykorzystać:

1)

ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment); 
fragment.specific_function_name(); 

Gdzie R.id.example_fragment jest najprawdopodobniej identyfikatorem FrameLayout w twoim układzie xml. LUB

2)

ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentByTag(“FragTagName”); 
fragment.specific_function_name(); 

Gdzie FragTagName to nazwa u określona przy u zrobili:

TabHost mTabHost.newTabSpec(“FragTagName”) 

Jeśli używasz „import android.support.v4.app. Fragment; " Następnie użyj:

1)

ExampleFragment fragment = (ExampleFragment) getSupportFragmentManager().findFragmentById(R.id.example_fragment); 
fragment.specific_function_name(); 

LUB

2)

ExampleFragment fragment = (ExampleFragment) getSupportFragmentManager().findFragmentByTag(“FragTagName”); 
fragment.specific_function_name(); 
+1

Mam CoordinatorLayout o identyfikatorze R.id.example_fragment, zwracaną wartość null. Używam importu android.support.v4.app.Fragment; co robić? – Kishore

+0

Proponuję opublikować to jako nowe pytanie i dołączyć swój przykładowy kod. Trudno powiedzieć źródło problemu, nie widząc rzeczywistego kodu. – Gene

3
  1. Jeśli nie używasz support Fragment biblioteki, a następnie wykonaj następujące czynności:

((FragmentName) getFragmentManager().findFragmentById(R.id.fragment_id)).methodName();


2. Jeśli używasz support Fragment biblioteki, a następnie wykonaj następujące czynności:

((FragmentName) getSupportFragmentManager().findFragmentById(R.id.fragment_id)).methodName();

3

myślę, że najlepiej jest, aby sprawdzić, czy fragment jest dodawany przed wywołaniem metody w fragmentu. Zrób coś takiego, aby uniknąć wyjątku zerowego.

ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment); 
if(fragment.isAdded()){ 
    fragment.<specific_function_name>(); 
} 
Powiązane problemy