@Riky_Maritn

Фрагменты Android. Почему получается NullPointerException в некоторых случаях?

Суть в чём, я имею две версии кода, которые по моему мнению должны делать одно и тоже. Но в одной из версий получается NullPointerException.
Что я пытаюсь сделать?
Мне надо получить введённые в EditText данные, EditText находится во фрагменте.
Приведённый ниже код работает.
Рабочий код

import android.os.Bundle;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import java.util.Timer;
import java.util.TimerTask;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

private FragmentManager fm;
private FragmentTransaction ft;
private MyFragment mf;
private TextView textView;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

textView = findViewById(R.id.textView_text_of_fragment);

fm = getSupportFragmentManager();
mf = new MyFragment();
}
@Override
public void onClick(View v) {
ft = fm.beginTransaction();

switch (v.getId()) {
case R.id.add_button:
if (fm.findFragmentByTag(MyFragment.FRAGMENT_TAG) == null) {
Toast.makeText(this, "Is add button!", Toast.LENGTH_SHORT).show();
ft.add(R.id.fragment_layout, mf, MyFragment.FRAGMENT_TAG);
Toast.makeText(this, "Fragment is added!", Toast.LENGTH_SHORT).show();
}
break;
case R.id.set_text_button:
if(fm.findFragmentByTag(MyFragment.FRAGMENT_TAG)!= null){
EditText text = findViewById(R.id.editText);
textView.setText(textView.getText() + text.getText().toString());
Toast.makeText(this, "Text is added!", Toast.LENGTH_SHORT).show();
}
break;
/* case R.id.remove_button:
if (fm.findFragmentByTag(MyFragment.FRAGMENT_TAG) != null) {
EditText text = findViewById(R.id.editText);
text.setText("");
Toast.makeText(this, "Fragment is removed!", Toast.LENGTH_SHORT).show();
ft.remove(mf);
}
break;*/
}
ft.commit();
}
}

Далее вторая версия кода, которая выдаёт NullPointerException, на метод setText().
Я пытался проверить наличие фрагмента в менеджере, и получил flase.
Не рабочий код

package com.example.mkiel.myapplication;

import android.os.Bundle;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

private FragmentManager fm;
private FragmentTransaction ft;
private MyFragment mf;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

fm = getSupportFragmentManager();
mf = new MyFragment();
}

@Override
public void onClick(View v) {

switch (v.getId()) {
case R.id.add_button:
ft = fm.beginTransaction();
if (fm.findFragmentByTag(MyFragment.FRAGMENT_TAG) == null) {
ft.add(R.id.fragment_layout, mf, MyFragment.FRAGMENT_TAG);
ft.commit();
ft = fm.beginTransaction();
EditText text = findViewById(R.id.editText);
text.setText("При вставке получается null исключение");
ft.commit();
}
break;
/* case R.id.set_text_button:
if (fm.findFragmentByTag(MyFragment.FRAGMENT_TAG) != null) {
EditText text = findViewById(R.id.editText);
textView.setText(textView.getText() + text.getText().toString());
}
break;*/

/* case R.id.remove_button:
if (fm.findFragmentByTag(MyFragment.FRAGMENT_TAG) != null) {
EditText text = findViewById(R.id.editText);
text.setText("");
Toast.makeText(this, "Fragment is removed!", Toast.LENGTH_SHORT).show();
ft.remove(mf);
}
break;*/

}
}
}

Код Фрагмента

public class MyFragment extends Fragment {
public final static String FRAGMENT_TAG = "FragmentOne";

public View view;
@Override
public View getView() {
return super.getView();
}

@Override
public View onCreateView( LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
view = inflater.inflate(R.layout.fragment_layout, container, false);
return view;
}
}

Помогите понять что я делаю не так и почему получается NullPointerException во второй версии кода.
Спасибо!
  • Вопрос задан
  • 45 просмотров
Решения вопроса 1
zagayevskiy
@zagayevskiy Куратор тега Android
Android developer at Yandex
Ты неправильно работаешь с фрагментами.
Как я понимаю, этот текствью, куда ты пытаешься сеттить текст, находится во фрагменте. Не надо так делать, это нарушает инкапсуляцию. Только сам фрагмент должен менять свои вьюхи.
Дальше, коммит происходит асинхронно. А то, что ты пытаешься как бы между началом транзакции и коммитом что-то сделать, явно надеясь на то, что это попадет в транзакцию, это неправильно. Транзакции только для фрагментов.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы