2012-10-23 8 views
51

Mam działanie, które zastąpiłem fragmentem. Działanie miało intencję, która zawierała dodatkowe informacje na temat danych, które powinna wyświetlać aktywność.Jeśli zadeklaruję fragment w układzie XML, w jaki sposób mogę przekazać pakiet?

Teraz, gdy moja Aktywność jest tylko opakowaniem wokół Fragmentu, który wykonuje tę samą pracę, w jaki sposób mogę uzyskać ten pakiet do Fragmentu, jeśli zadeklaruję fragment w XML z tagiem?

Gdybym użył FragmentTransaction do umieszczenia Fragmentu w ViewGroup, dostałbym szansę, aby przekazać te informacje w konstruktorze Fragment, ale zastanawiam się nad sytuacją, w której fragment jest zdefiniowany w XML .

+0

Spróbuj tego, https://stackoverflow.com/questions/8641575/custom-attributes-in-android-fragments/17674292#17674292 –

Odpowiedz

42

teraz, że moja działalność jest po prostu otoki wokół Fragment, dokłada taką samą pracę, jak mogę dostać ten pakiet do fragmentu jeśli Oświadczam fragment XML z etykietą?

Nie możesz.

Możesz jednak zadzwonić pod numer findFragmentById() na swój numer FragmentManager w celu pobrania fragmentu post-inflacji, a następnie wywołać metodę na fragmencie, aby powiązać z nim dane. Chociaż prawdopodobnie nie może to być setArguments(), twój fragment może zorganizować przechowywanie samych danych po zmianie konfiguracji w inny sposób (onSaveInstanceState(), setRetainInstance(true) itd.).

+0

Kiedy zadałem to pytanie, postanowiłem udać się na inną trasę. Ale właśnie dziś miałem podobną sytuację i wróciłem do tego postu. Myślałem, że spróbuję. Rozwiązanie setArguments nie działa: 10-24 12: 48: 33.276: E/AndroidRuntime (21417): Spowodowane przez: java.lang.IllegalStateException: Fragment już aktywny Idąc, próbuję po prostu wywołać metodę w Fragment . – Plantage

+0

Wczoraj spotkałem się z tym samym IllegalStateException. Problem wydaje się, że musisz wywołać 'setContentView()', aby Fragments były zawyżone.Ale 'setContentView()' również dołącza je do działania, co sprawia, że ​​jest zbyt późno, aby wywołać 'setArguments()'. – Michael

+2

To nie powinno być oznaczone jako prawidłowe. Jest niepoprawny. Zgodnie z fragmentem dokumentacji (http://developer.android.com/reference/android/app/Fragment.html#setArguments(android.os.Bundle), setArguments() musi zostać wywołany zanim fragment zostanie dołączony do działania Jeśli możesz znaleźć fragment za pomocą findFragmentById(), to fragment został już dołączony. Patrz http://stackoverflow.com/questions/21403040/android-fragment-declared-in-layout-how-to-set-arguments? lq = 1 dla poprawnego rozwiązania – Neil

3

Jedyne rozwiązanie, jakie widzę, to nie używać argumentów jako kanału wymiany danych. Zamiast tego utwórz fragment, aby uzyskać niezbędne informacje z innych źródeł. Oddzwoń, aby uzyskać odpowiednią aktywność, sprawdź tymczasową pamięć pamięci, obiekt Singleton, itp.

Innym rozwiązaniem, które może być pomocne, jest zastosowanie struktur, które pozwalają niezwiązanym obiektom na wymianę komunikatów za pośrednictwem wzoru projektu Mediator, jako Otto.

37

To nie jest zamknięta droga, ale skończyło się na „ciągnięcie” zawiniątko z działalności dominującej:

Bundle bundle = getActivity().getIntent().getExtras(); 
9

Inną opcją jest nie deklarują fragment w formacie XML. Wiem, że nie jest dokładnie to, co chcesz robić. Jednak można zadeklarować prosty układ w widoku tak:

<LinearLayout 
     android:id="@+id/fragment_container" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" /> 

A potem w swojej klasie Activity programowo napompować układ z fragmentu. W ten sposób można przechodzić przez parametry za pomocą argumentów.

FragmentManager fragmentManager = getSupportFragmentManager(); 
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
    MyFragment fragment = MyFragment.newInstance(); 
    Bundle args = new Bundle(); 
    args.putInt(Global.INTENT_INT_ROLE, 1);' 
    fragment.setArguments(args); 
    fragmentTransaction.add(R.id.fragment_container, fragment, "MyActivity"); 
    fragmentTransaction.commit(); 

Takie podejście nie jest tak czyste i proste, jak deklarowania go w xml Mam jednak przeniósł się do niego, ponieważ daje dużo większą kontrolę nad fragmentem.

+0

To podejście "nie rób tego", ale ma dla mnie więcej sensu niż idea wymiany danych za pośrednictwem obiektów singleton (jak sugeruje inna odpowiedź) –

Powiązane problemy