Активность в Навигаторе: передача значений между фрагментами - PullRequest
0 голосов
/ 03 мая 2020

У меня проблема, я не могу передать значение String из Fragment в другое Fragment.

Это часть моего кода:

FragmentA:

public class HomeFragment extends Fragment {

private HomeViewModel homeViewModel;

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater,
                         ViewGroup container, Bundle savedInstanceState) {
    homeViewModel =
            ViewModelProviders.of(this).get(HomeViewModel.class);
    View root = inflater.inflate(R.layout.fragment_home, container, false);

    Button btn = (Button) root.findViewById(R.id.myButton);
    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            GalleryFragment galleryFragment = new GalleryFragment();
            Bundle bundle = new Bundle();
            String s = "ciao";
            bundle.putString("Data", s);
            galleryFragment.setArguments(bundle);
            Toast.makeText(getActivity(),s,Toast.LENGTH_LONG).show(); //with this i know the function is ok
        }
    });
    return root;
}
}

FragmentB:

public class GalleryFragment extends Fragment {

private GalleryViewModel galleryViewModel;
public View onCreateView(@NonNull LayoutInflater inflater,
                         ViewGroup container, Bundle savedInstanceState) {
    galleryViewModel =
            ViewModelProviders.of(this).get(GalleryViewModel.class);
    View root = inflater.inflate(R.layout.fragment_gallery, container, false);

    Bundle bundle = getActivity().getIntent().getExtras();
    TextView textView = (TextView) root.findViewById(R.id.myTitleText);
    if(bundle!=null){
        String name = bundle.getString("Data");
        Toast.makeText(getActivity(),name,Toast.LENGTH_LONG).show();
        textView.setText(name);
    }
    return root;
}
}

Если я удалите часть if(bundle!=null), отладчик выдаст мне эту ошибку:

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.os.Bundle.getString(java.lang.String)' on a null object reference

РЕЗЮМЕ:

Я нахожусь на fragmentA -> Я нажимаю кнопку -> Я перехожу на fragmentB, чтобы посмотреть, изменилось ли значение TextView -> ничего не произошло.

Может кто-нибудь объяснить мне, в чем ошибка?

Спасибо за ваше время.

Ответы [ 2 ]

0 голосов
/ 03 мая 2020

это решение -_-, я не знаю, почему раньше не работало.

Внутри FragmentA в методе onClick, вставьте это в конце:

            FragmentTransaction transaction = getFragmentManager().beginTransaction();

            transaction.replace(R.id.nav_host_fragment, galleryFragment);
            transaction.addToBackStack(null);

            transaction.commit();

Я выкладываю это для тех, кому это нужно

0 голосов
/ 03 мая 2020

Вы должны заглянуть в ViewModel: Обзор ViewModel .

Вам следует инициализировать ViewModel в родительском действии, а затем при создании каждого фрагмента предоставить доступ к этой общей модели ViewModel.

После этого все 3 компонента будут иметь общий доступ к общему объекту, учитывающему жизненный цикл, который вы можете использовать для простого взаимодействия.

...