Доступ к TextView внутри фрагмента дает исключение NullPointerException - PullRequest
3 голосов
/ 06 марта 2020

Фрагмент определяется следующим образом. Я пытаюсь установить текст positionTextView.

public class Fragment2 extends Fragment {
    private TextView positionTextView,fragment2TextView;
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view =  inflater.inflate(R.layout.layout_fragment2, container, false);
        positionTextView = view.findViewById(R.id.positionTextView);
        fragment2TextView = view.findViewById(R.id.fragment2TextView);

        Toast.makeText(getContext(),"OnCreateView",Toast.LENGTH_LONG).show();
        return  view;

    }

    public void setContentOfTextView( int position) {
        positionTextView.setText(Integer.toString(position));
    }
}

И в MainActivity я добавляю Fragment2 следующим образом.

@Override
public void fragmentRespond(int index) {
    FragmentTransaction transaction =  fragmentManager.beginTransaction();
    Fragment2 fragment2 = new Fragment2();
    transaction.add(R.id.group2,fragment2,"fragment2");
    transaction.commit();
    transaction.addToBackStack("fragment2");
    fragment2.setContentOfTextView(index);
}

У меня есть fragmentRespond функция в другом фрагменте, который содержит ListView. ListView s onItemClickListener вызывает эту функцию, то есть fragmentRespond(int index).

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

    String[] quotes = getResources().getStringArray(R.array.quotes);
    CustomArrayAdapter customArrayAdapter = new CustomArrayAdapter(getContext(),quotes,null);
    listView.setAdapter(customArrayAdapter);
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            fragmentCommunicator.fragmentRespond(position);
        }
    });
}

И я получаю следующую ошибку

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

Любые предложения, касающиеся этой проблемы или улучшения стиля кодирования, очень приветствуются.

Заранее спасибо.

1 Ответ

2 голосов
/ 06 марта 2020

Вы получаете NPE, потому что представление Fragment еще не было загружено, когда вы пытаетесь установить текст с помощью функции setContentOfTextView из вашей деятельности.

Вид в вашем фрагменте должен быть сначала надут, чтобы что-то загрузить в него. Следовательно, вы должны сделать это в функции onCreateView вашего фрагмента.

О передаче информации из вашей деятельности - вы можете легко сделать это, используя Bundle, переданный вашему фрагменту при запуске из вашей деятельности.

Вот как вы можете это сделать.

В своей деятельности передайте данные, используя Bundle при запуске вашего фрагмента.

@Override
public void fragmentRespond(int index) {

    // Prepare the bundle
    Bundle bundle = new Bundle();
    bundle.putInt("index", index);

    FragmentTransaction transaction =  fragmentManager.beginTransaction();
    Fragment2 fragment2 = new Fragment2();
    fragment2.setArguments(bundle); // Set the arguments here to be passed on to your fragment while loading.

    transaction.add(R.id.group2,fragment2, "fragment2");
    transaction.commit();
    transaction.addToBackStack("fragment2");
}

И в своем фрагменте получите нужные данные из этого Bundle и загрузите их в свой TextView.

@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view =  inflater.inflate(R.layout.layout_fragment2, container, false);
    positionTextView = view.findViewById(R.id.positionTextView);
    fragment2TextView = view.findViewById(R.id.fragment2TextView);

    // Load the information in your TextView here
    Bundle args = getArguments();
    if (args != null && args.containsKey("index")) {
        setContentOfTextView(args.getInt("index"));
    }

    Toast.makeText(getContext(),"OnCreateView",Toast.LENGTH_LONG).show();
    return  view;
}

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...