2015-11-02 4 views
4

Я пытаюсь заставить свой фрагмент работать, и я не могу сделать все, что я пытаюсь сделать.Андроид фрагмент и ссылка на нулевой объект

Ошибки я получаю:

java.lang.NullPointerException: Попытка вызвать виртуальный метод «недействительный android.widget.TextView.setText (java.lang.CharSequence)» на нулевой ссылке на объект

Вот код:

public class FragmentOne extends Fragment { 

    private TextView one; 

    public FragmentOne() { 
     // Required empty public constructor 
    } 

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

     one = (TextView) getActivity().findViewById(R.id.one); 

     // Displaying the user details on the screen 
     one.setText("kjhbguhjg"); 

    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     return inflater.inflate(R.layout.fragment1, container, false); 

    } 
} 

понятия не имею, почему это не работает. Я тестирую этот класс только для того, чтобы увидеть, будет ли текст изменен в текстовом виде. Я использую правильный идентификатор, потому что я проверил это как 10 раз, но я думаю, что проблема в том, что textview one является нулевым объектом. Но почему он не находит идентификатор?

ответ

7

onCreate() вызван до onCreateView(), поэтому к нему не будет доступа к onCreate().

Решение: Move

one = (TextView) getActivity().findViewById(R.id.one); 

в onViewCreated() вместо.

См. Рисунок ниже для обзора fragment lifecycle.

Новый фрагмент кода выглядит следующим образом:

public class FragmentOne extends Fragment { 


    private TextView one; 

    public FragmentOne() { 
     // Required empty public constructor 
    } 

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

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     return inflater.inflate(R.layout.fragment1, container, false); 
    } 

    @Override 
    public void onViewCreated(View view, Bundle savedInstanceState){ 
     one = (TextView) getActivity().findViewById(R.id.one); 
     // Displaying the user details on the screen 
     one.setText("kjhbguhjg"); 
    } 
} 

Fragment lifecycle

+0

Попробованного, что раньше ... В этом случае я получаю сообщение об ошибке недостижимости заявления ... – AlwaysConfused

+0

Вы недостижимые ошибки из ваших ** компилятор **. Пожалуйста, дважды проверьте наличие синтаксических ошибок. Отправьте свой полный код. –

+0

Весь мой код в вопросе, я сделал, как вы предложили. Я переместил 'one = (TextView) getActivity(). FindViewById (R.id.one);' to onCreateView чуть ниже 'return inflater.inflate (R.layout.fragment1, container, false);' – AlwaysConfused

2

Or. вместо того, чтобы переписать

public void onViewCreated(View view, Bundle savedInstanceState) 

вы можете немного изменить onCreateView так это выглядит, как

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
// Inflate the layout for this fragment 
View rootView = inflater.inflate(R.layout.fragment1, container, false) 
one = (TextView) rootView.findViewById(R.id.one) 
return rootView; 
} 
+0

Спасибо! Я буду иметь ввиду! – AlwaysConfused

+1

У вас ошибка недостижимого оператора, потому что вы положили one = (TextView) rootView.findViewById (R.id.one) после оператора return, который является окончательным выражением для метода. – JDRussia

Смежные вопросы