Что должен делать onCreate в DialogFragment?

В настоящее время я возился с DialogFragment, чтобы научиться его использовать. Я предположил, что по сравнению с onCreateView(), onCreate() может сделать это:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    testTextView.setText("SUCCESS!"); //ERROR HERE
}

Но я ошибаюсь. Не уверен, почему он не работает. Ошибка исчезает, когда я закомментирую testTextView.setText("Success!"); Ошибка представляет собой исключение NullPointerException, а затем она просто помечает строку 39, в которой находится ошибочная строка кода. Любые разъяснения очень ценятся.

РЕДАКТИРОВАТЬ:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
    View testView = (View)inflater.inflate(R.layout.test_dialog_file, container, false);
    //instantiated testTextView globally
    testTextView = (TextView)testView.findViewById(R.id.set_text);
    testTextView.setText("SUCCESS!");
    return testView;
}

person Andy    schedule 15.06.2012    source источник


Ответы (3)


testTextView НЕ указывает на какой-либо объект, поэтому попробуйте что-то вроде

testTextView = (TextView) findViewById(R.id.testTextView);

ИЗМЕНИТЬ:

Если вы видите жизненный цикл фрагмента, это говорит о том, что onCreateView вызывается после onCreate, поэтому ваш onCreate не имеет никакой ссылки на ваш объект, то есть текстовое представление в вашем макете

person Sana    schedule 15.06.2012
comment
У меня есть один быстрый вопрос, который Док не говорит. В DialogFragments мне нужно использовать onAttach()? И я буду, за исключением того, что это не позволит мне, пока не пройдет определенное время, лол. - person Andy; 15.06.2012
comment
если вы хотите, вы можете использовать onAttach(), но вам это не нужно в вашем случае. - person Sana; 15.06.2012
comment
onAttach следует использовать, чтобы вы могли сделать некоторые init() для своего фрагмента, но в вашем случае это просто создание представления и попытка получить ссылку, которую вы должны сделать в своем методе onCreate. - person Sana; 15.06.2012

Вы еще не использовали setContentView, поэтому получаете NPE для TextView.

onCreate происходит раньше onCreateView. Если вы хотите получить доступ к чему-то из макета, вам нужно setContentView... что не очень хорошая идея для DialogFragment.

Переместите этот фрагмент кода в onCreateView после setContentView, и все будет в порядке.

Для справки, вот жизненный цикл фрагмента:

введите здесь описание изображения

person Barak    schedule 15.06.2012
comment
Ах. Поскольку у вас есть эта замечательная диаграмма, я мог бы также спросить, onAttach(), должен ли я использовать ее в DialogFragment? - person Andy; 15.06.2012
comment
Честно говоря, я никогда не использовал onAttach, поэтому я действительно не знаю... Я пытаюсь подумать, для чего вы можете его использовать... очевидно, ничего не связанного с пользовательским интерфейсом. :) - person Barak; 15.06.2012
comment
Ха-ха. Конечно. Было любопытно, охватывая все основы. Не похоже, что кто-то использует его в учебниках. Было интересно, почему. Спасибо. - person Andy; 15.06.2012
comment
OnAttach() обычно используется для присоединения слушателей к родительской активности. - person Warpzit; 18.06.2012

Вы инициализировали testTextView в onCreateView? Вы должны использовать LayoutInflater в onCreateView, чтобы получить макет, а затем должны получить доступ к TextView через findViewById.

person Tim    schedule 15.06.2012
comment
Да сэр. Сделал это. Я опубликую этот код. Как видите, ошибка странная, я бы предположил, что мог бы setText - person Andy; 15.06.2012
comment
Совсем не странно, так как onCreateView происходит после onCreate. - person Barak; 15.06.2012