2012-07-31 15 views
17

Mam aktywność, która robi transakcję fragmentAndroid: Fragment nie może dostać aktywność

DetailFragment newFragment = new DetailFragment(); 
transaction.replace(R.id.mylist, newFragment); 
transaction.addToBackStack(null); 
transaction.commit(); 

że działa dobrze. Teraz wiem w ramach mojej działalności dynamiczny ciąg, który muszę zastąpić w układzie, który mam w newFragment. Myślałem, że mogę zadzwonić po transaction.commit() tylko coś podobnego

newFragment.setMyString("my dynamic value"); 

aw newFragment.java mam

public void setMyString(String s) 
{ 
TextView tv = (TextView) getActivity().findViewById(R.id.myobject); 
tv.setText(s); 
} 

Chodzi o to, że getActivity() zwraca wartość null. Jak mogę uzyskać kontekst potrzebny do znalezienia elementów mojego układu?

Edit:

staram się śledzić trasę przy użyciu wiązki jak to wydaje się być najczystszym sposobem. Więc zmieniłem kod:

Bundle b = new Bundle(); 
b.putString("text", "my dynamic Text"); 
DetailFragment newFragment = new DetailFragment(); 
transaction.replace(R.id.mylist, newFragment); 
transaction.addToBackStack(null); 
transaction.commit(); 

Moja fragment onCreateView wygląda następująco:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
{ 
    View v = inflater.inflate(R.layout.mylayout, container, false); 
    TextView t = (TextView) v.findViewById(R.id.texttobereplaced); 
    t.setText(savedInstanceState.getString("text"); 
} 

Wydaje się, że savedInstranceState jest pusty. Gdzie powinienem znaleźć mój pakiet?

Edit2:

brakowało getArguments() w odpowiedzi. działa teraz.

Odpowiedz

17

Twój Fragment nie dołączone do Activity jeszcze, co oznacza również Twój układ Hasn zostały jeszcze zawyżone (patrz: Fragment lifecycle). Najlepszym rozwiązaniem byłoby dodanie wartości String jako argumentu do metody Fragment za pomocą metody Fragment.setArguments(Bundle). Można go pobrać w odbiorze Fragment metodą Fragment.getArguments().

+1

Mój układ jest zawyżony onViewCreated jest wywoływana. Widzę mój układ. – AndyAndroid

2

więc jestem również za pomocą tego samego menedżera transakcji fragment, a jedynym problemem widzę w kodzie jest to, że można zdefiniować tv TextView wewnątrz onCreateView metody klasy newFragment a następnie oznacz ją jako tak:

public class AboutFragment extends Fragment { 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.newFragment, container, false); 
     TextView tv = (TextView) v.findViewById(R.id.textview); 
     return v; 
    } 

    public void setMyString(String s) { 
     tv.setText(s); 
    } 
} 

wiem, że does'nt zrobić naprawdę wiele sensu, ale to jest jak używam mojego kodu i działa dobrze :)

+0

Przepraszam, nie wiedziałem, że to było ważne :) zmienił to .. wygląda lepiej teraz – Android2390

+3

Oczywiście wcięcie twojego kodu jest ważne na StackOverflow ... ludzie nie będą myśleć, że jesteś bardzo wiarygodnym źródłem, jeśli twoje kod jest rażąco nieczytelny. Właśnie zredagowałem twoją odpowiedź i usunąłem notatkę. –

20

Upewnij się nazywają getActivity() lub po onAttach(), jak poprzednio następnie powróci null.

+0

Niestety nie rozumiem, gdzie wezwę funkcji getActivity() i przekażę ją do mojej funkcji setMyString(). I jeśli zrobię to, gdy sugerujesz, że nadal piszesz, może zwrócić wartość null lub nie. Jak mam to zrozumieć? – AndyAndroid

+6

Fragment 'zostanie dołączony do' null' aktywności do 'onActivityCreated' ... to znaczy, jeśli wywołasz' getActivity() 'w' onCreate' lub 'onCreateView', zwróci' null', ponieważ ' Aktywność "nie została jeszcze utworzona. Tak więc upewnij się, że masz wszystkie połączenia z 'getActivity()' * w lub po * 'onActivityCreated'. –

+4

To jest złe. Po wywołaniu funkcji onAttach można wywołać funkcję getActivity() bez zwracania wartości null. onActivityCreated jest po prostu callbackiem, gdy działanie zostało w pełni utworzone, a układ fragmentu został utworzony. – dymmeh

0

jeśli u trzeba zadzwonić getActivity w OnCreateView, przenieść wszystkie ur kod z onCreateView do onActivityCreate i tylko lewy linie

View v = inflater.inflate(R.layout.xxxx, container, false); 
    return v; 

w onCreateView

ale mam zabawną sytuację.

w moim onActivityCreated

Spinner s1 = (Spinner) getActivity().findViewById(R.id.bitlength); 
    ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
      getActivity(), R.array.bitlengths, 
      android.R.layout.simple_spinner_item); 
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    s1.setAdapter(adapter); 

Sometime onActivityCreated przyzwyczajenie uruchomić (prawidłowo !?), a tym samym z tarczy s1 stać pusty.

Powiązane problemy