2012-07-09 14 views
82

Z Działalności, kiedyś to zrobić:Gdzie/Jak uzyskaćIntent(). GetExtras() w Android Fragment?

W Działaniu 1:

Intent i = new Intent(getApplicationContext(), MyFragmentActivity.class); 
       i.putExtra("name", items.get(arg2)); 
       i.putExtra("category", Category); 
       startActivity(i); 

W Działanie 2:

Item = getIntent().getExtras().getString("name"); 

Jak to zrobić za pomocą Fragmenty? Używam również biblioteki zgodności v4.

Czy wchodzi w funkcję FragmentActivity? Lub faktyczny Fragment? I do której metody to służy? onCreate? onCreateView? inne?

Czy mogę zobaczyć przykładowy kod, proszę?

EDYCJA: Warto zauważyć, że staram się utrzymywać aktywność 1 jako działanie (lub w rzeczywistości ListActivity, w której przechodzę zamiar listitem po kliknięciu), a następnie przejść do zestawu fragmentów z zakładkami (poprzez fragment) Aktywność) i potrzebuję jednej karty, aby móc uzyskać dodatki. (Mam nadzieję, że jest to możliwe?)

+2

Może to być duplikat, ale wydaje się, że ludzie bardziej lubią to pytanie. Mówię tylko. – KickingLettuce

Odpowiedz

97

To, co robię, i uważam, że to jest to, co Google zamierzał zrobić również dla programistów, to nadal uzyskać dodatki od Intent w postaci Activity, a następnie przekazać dodatkowe dane na fragmenty, tworząc je za pomocą argumentów.

Na blogu deweloperów systemu Android jest rzeczywiście an example, który ilustruje tę koncepcję, a zobaczysz to również w kilku demach interfejsu API. Mimo że ten konkretny przykład jest podany dla fragmentów API 3.0+, ten sam przepływ dotyczy używania FragmentActivity i Fragment z biblioteki pomocy.

najpierw odzyskać zamiarem dodatki jak zwykle w swojej działalności i przekazać je jako argumenty do fragmentu:

public static class DetailsActivity extends FragmentActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     // (omitted some other stuff) 

     if (savedInstanceState == null) { 
      // During initial setup, plug in the details fragment. 
      DetailsFragment details = new DetailsFragment(); 
      details.setArguments(getIntent().getExtras()); 
      getSupportFragmentManager().beginTransaction().add(
        android.R.id.content, details).commit(); 
     } 
    } 
} 

Zamiast bezpośredniego wywoływania konstruktora, to chyba łatwiejsze w użyciu statycznej metody, które podłącza argumenty do fragmentu dla ciebie. Taka metoda jest często nazywana newInstance w examples given by Google. Tam faktycznie jest newInstance metoda DetailsFragment, więc jestem pewien, dlaczego to nie jest używane w powyższym fragmencie ...

Tak czy inaczej, wszystkie dodatki przewidziane jako argument na tworzenie fragment, będzie dostępna przez wywołanie . Ponieważ to zwraca wartość Bundle, jej użycie jest podobne do funkcji dodatków w postaci Activity.

public static class DetailsFragment extends Fragment { 
    /** 
    * Create a new instance of DetailsFragment, initialized to 
    * show the text at 'index'. 
    */ 
    public static DetailsFragment newInstance(int index) { 
     DetailsFragment f = new DetailsFragment(); 

     // Supply index input as an argument. 
     Bundle args = new Bundle(); 
     args.putInt("index", index); 
     f.setArguments(args); 

     return f; 
    } 

    public int getShownIndex() { 
     return getArguments().getInt("index", 0); 
    } 

    // (other stuff omitted) 

} 
+0

Hej dziękuję, zaznaczę to jako poprawne, kiedy będę mógł to wypróbować, ale wygląda mi dobrze!W międzyczasie, jeśli chcę wziąć wartość intencji i ustawić tekst na textView - w oparciu o twoją odpowiedź, czy tak będzie? "tv.setText (getShownIndex())"? I faktycznie złapałem DWA różne dodatki - w moim przypadku "nazwy" i "kategorie" - jak to zmienia powyższy kod? – KickingLettuce

+0

Wystarczy dodać tyle parametrów do 'newInstance (...)', jak trzeba przekazać dodatki i umieścić je w argumentach 'Bundle'. Osobiście zwykle wyszukuję wszystkie argumenty w jednej z metod 'onCreate ...()' fragmentu i przypisuję je do zmiennych. W ten sposób powinieneś być w stanie używać ich w dowolnym miejscu w ramach wdrożenia. –

+0

W przypadku pobierania w onCreate, jaka jest składnia? Zwykle użyłem "Item = getIntent(). GetExtras(). GetString (" name "); ' Jak się teraz zmienia? (Myślę, że to odpowiada na ostatnie pozostające pytanie) – KickingLettuce

150

można nadal korzystać

String Item = getIntent().getExtras().getString("name"); 

w fragment, wystarczy zadzwonić getActivity() pierwszy:

String Item = getActivity().getIntent().getExtras().getString("name"); 

To oszczędza konieczności pisania kodu.

+0

Pozwala to zaoszczędzić sporo pisania kodu! dobry :) –

+3

Awesome!To naprawdę uratowało mnie napisać dużo kodu;) –

+2

Prosty i elegancki sposób na odzyskiwanie danych intencji. – zeeshan

Powiązane problemy