Подтвердить что ты не робот

Доступ к фрагменту Вид из действия onCreate

Я запускаю свое первое приложение для Android, и у меня есть Fragment, который добавляется в мой Activity в методе Activity onCreate(). Проблема, с которой я сталкиваюсь, заключается в том, что я не могу найти ни одного из представлений, содержащихся в Fragment, из метода Activity onCreate().

Другие потоки предположили, что это связано с тем, что Fragment еще не завышен, поэтому findViewById() возвращает null для любых представлений, содержащихся в Fragment.

Вот что я имею в виду:

Активность:

@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);
}

Это выводит результаты:

активность onCreate конец действия onCreate фрагмент onCreateView

Из-за этого порядка любая попытка доступа к представлениям Fragment в методе Activity onCreate() (с использованием findViewById()) создает NullPointerException, так как Fragment onCreateView() получает только называемый ПОСЛЕ окончания Activity onCreate().

Использование FragmentManger executePendingTransactions() после добавления Fragment не помогает.

В принципе, я был вынужден помещать код проблемы в метод Activity onStart() вместо onCreate(), так как onStart() происходит ПОСЛЕ Fragment onCreateView().

Кто-нибудь, что представляет собой стандартная практика, или как я могу сделать свой код доступа к фрагментам в рамках метода Activity onCreate()?

4b9b3361

Ответ 1

Обновите свои представления в 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;
}

Или, если ваши изменения зависят от Activity к вашему Fragment, используйте onActivityCreated().

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

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