2012-08-25 12 views
26

Jestem w trakcie tworzenia mojej pierwszej aplikacji na system Android i mam Fragment, która zostanie dodana do mojej Activity w metodzie Activity 's onCreate(). Problem, z którym się borykam, polega na tym, że nie mogę znaleźć żadnego z poglądów zawartych w metodzie Fragment z metody Activity 'onCreate().Widok fragmentu dostępu z działania jest włączony

Inne wątki sugerują, że dzieje się tak, ponieważ Fragment nie został jeszcze zawyżony, więc findViewById() zwróci wartość null dla wszystkich widoków zawartych w Fragment.

Oto co mam na myśli:

aktywny:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    System.out.println("activity onCreate"); 
    setContentView(R.layout.activity_main); 

    if (savedInstanceState != null) { 
     return; 
    } 

    initialiseUI(); // Fragment added to Activity 

    System.out.println("end of activity onCreate"); 
} 

Fragment:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
    Bundle savedInstanceState) { 
System.out.println("fragment onCreateView"); 
    return inflater.inflate(R.layout.event_log, container, false); 
} 

ten drukuje wyniki:

aktywność onCreate koniec działalności onCreate fragment onCreateView

powodu tej kolejności, każda próba dostępu poglądy Fragment Państwu ActivityonCreate() metody s (przy użyciu findViewById()) wytwarza NullPointerException, jak Fragment” s onCreateView() tylko jest wywoływana po zakończeniu tych Activity „s onCreate().

Po dodaniu Fragment po Fragment nie pomaga.

Zasadniczo zostały zmuszone do wprowadzenia kodu problemem w Activity „s onStart() metody zamiast onCreate(), jak onStart() dzieje się po Fragment” s onCreateView().

Czy ktoś, co standardową praktyką jest tutaj, lub w jaki sposób mogę zrobić mój kod dostępu do fragmentów pracy działa w ramach metody Activity 's onCreate()?

+1

Dlaczego chcesz uzyskać dostęp do widoków 'Fragment' w' Activity '' onCreate() 'metoda? Coś jest nie tak z twoim projektem. – biegleux

+0

W szczególności, po dodaniu fragmentu w metodzie onCreate() działania, chcę zmienić tekst TextView zawartego w Fragmentie i dodać niektóre elementy do Spinnera. Co może być nie tak z moim projektem? – Dan

+0

Niż zaktualizuj układ fragmentu w metodzie 'Fragment'' onCreateView() '. Zobacz moją odpowiedź. – biegleux

Odpowiedz

19

Zaktualizuj swoje poglądy w onCreateView().

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
    Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.event_log, container, false); 
    TextView tv = (TextView) view.findViewById(R.id.text); 
    tv.setText("hello world"); 
    return view; 
} 

lub jeśli zmiany zależą Activity swój Fragment jest dołączony do użyć onActivityCreated().

@Override 
public void onActivityCreated (Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 

    TextView tv = (TextView) getView().findViewById(R.id.text); 
    tv.setText(getActivity.getSomeText()); 
} 
+0

OK, po milionie innych problemów, na które nie będę mógł sobie pozwolić, w końcu to działa poprawnie! Dziękuję za pomoc. – Dan

+1

@Dan, czy możesz podzielić się dokładnie z innymi problemami i jak użyłeś powyższego rozwiązania, aby go rozwiązać? Byłby to wielki wkład społeczności. –

+1

Zasadniczo próbowałem użyć onActivityCreated() do zainicjowania moich komponentów, myśląc, że ta metoda zostanie wywołana tylko raz. Spowodowało to wiele problemów podczas wstrzymywania i ponownego uruchamiania aplikacji, ponieważ ta metoda resetowała wszystkie moje składniki, ponieważ jest wywoływana za każdym razem. Następnie, próbując zrobić to za pomocą onCreateView(), użyłem getView(). FindViewById (...) zamiast używać już zainicjowanej zmiennej "view". To był głupi błąd, ale dotarłem na końcu! Teraz tekst jest zapisywany w polu onCreate() i umieszczany w widoku TextView onCreateView(). – Dan

Powiązane problemy