导航抽屉活动:在片段之间传递值

时间:2020-05-03 14:52:46

标签: java android navigation-drawer

我有问题,我无法将String的{​​{1}}值传递给另一个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是否已更改值->什么也没发生。

有人可以告诉我这是什么错误吗?

谢谢您的时间。

2 个答案:

答案 0 :(得分:0)

您应该查看ViewModel:ViewModel Overview

您应该在父级活动中初始化一个ViewModel,然后在创建每个Fragment时,提供对该通用ViewModel的访问。

然后,所有3个组件将共享对一个具有生命周期意识的对象的共享访问权限,您可以使用这些对象进行轻松的相互通信。

答案 1 :(得分:0)

这是解决方案-_-,我不知道为什么之前没起作用。

FragmentA方法的onClick内,将其粘贴在末尾:

            FragmentTransaction transaction = getFragmentManager().beginTransaction();

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

            transaction.commit();

我将其发布给需要它的人