getActivity().findViewById(R.id.towrite) иногда возвращает null

372
08 сентября 2017, 20:32

Пытаюсь получить и изменить xml элемент Активити, находясь внутри Фрагмента

  1. Создаю переменную в фрагменте

    public TextView writeable;
    
  2. В методе OnActivityCreated (Тоже во фрагменте) получаю в эту переменную xml-элемент. В этом методе получается написать текст в TextView

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        writeable = getActivity().findViewById(R.id.towrite);
        writeable.setText("wtf?");
        super.onActivityCreated(savedInstanceState);
    }
    
  3. Обрабатываю OnClick.

    На xml-кнопке написано android:onClick="onButtonClick". Этот метод находится в Активити. Выглядит так:

    public void onButtonClick(View v) {
        KvaActivity myFragment = new KvaActivity();
        myFragment.onButtonClick(v); 
    }
    

    Вызываем метод onButtonClick(), который находится во фрагменте. Тут я пытаюсь написать текст в TextView, полученный в OnActivityCreated

    public void onButtonClick(View v) {
        writeable.setText("1234567");
    }     
    

    Подходит только такой способ, у меня куча кнопок, для каждой не хочется прописывать OnClickListener, поэтому сделал с помощью xml. А нажатие на кнопку в коде видно только в активити.

  4. Ну что ж, приложение вылетает после клика, смотрю логи:

    Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference

Т.е. в OnClick переменная считается незаполненной. Как так, если в OnActivityCreated все прекрасно? И самое главное - как это исправить?

UPD Дополнил вопрос, почитав комментарии

Answer 1

KvaActivity myFragment = new KvaActivity(); myFragment.onButtonClick(v); Ошибка NPE возникает из-за того, что в onClick вы создаете новый объект фрагмента и вызываете метод у него. Т.к. данный фрагмент был только создан, но не был добавлен с помощью FragmentTransaction, то и события жизненного цикла не вызываются.

P.S.

  • findViewById(R.id.towrite) лучше вызывать в методе onViewCreated во фрагменте
  • лучше все таки прописать обработчики у каждой кнопки во фрагменте
Answer 2

Скорее всего, getActivity() возвращает null. Если так, то создайте переменную View view, в методе фрагмента onCreateView пишите

view = inflater.inflate(R.layout.название_layout-файла_фрагмента, null);,

далее вместо

writeable = getActivity().findViewById(R.id.towrite);

пишите

writeable = view.findViewById(R.id.towrite);

READ ALSO
Данные для приложения на Android

Данные для приложения на Android

Пишу приложение, которое должно выдавать информацию о мероприятиях проходящих в том или ином городеЯ столкнулся с проблемой - где брать данные...

265
Пул потоков в связке с асинхронными задачами

Пул потоков в связке с асинхронными задачами

Я начал изучать многопоточность и столкнулся с проблемой что ExecutorService не работает в связке с ассинхронными задачами

334
Помогите упростить функцию

Помогите упростить функцию

Помогите упростить функцию drawRect(int w, int h);Понимаю, костыли за костылями, но на ошибках учатся

269