我有问题,我无法将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
是否已更改值->什么也没发生。
有人可以告诉我这是什么错误吗?
谢谢您的时间。
答案 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();
我将其发布给需要它的人