英文:
Navigation Drawer Activity: passing values between fragment
问题
以下是翻译好的内容:
我有一个问题,我无法将一个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(); //通过这个我知道函数是正常的
}
});
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: 尝试调用空对象引用上的 'java.lang.String android.os.Bundle.getString(java.lang.String)' 方法
总结:
我在fragmentA
--> 我点击按钮 --> 我移动到fragmentB
来查看TextView
是否已更改值 --> 什么也没发生。
有人能解释一下错误是什么吗?
谢谢你的时间。
英文:
I have a problem, I can't pass a String
value from a Fragment
to another Fragment
.
This is a part of my code:
The 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;
}
}
The 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 I delete the if(bundle!=null)
part, the debugger give me this error:
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.os.Bundle.getString(java.lang.String)' on a null object reference
SUMMARY:
I am on fragmentA
--> I click the button --> I move to fragmentB
to see if the TextView
has changed value --> nothing happened.
Can someone explain me what is the error?
Thank you for your time.
答案1
得分: 0
你应该了解一下 ViewModel:ViewModel 概述。
你应该在父活动中初始化一个 ViewModel,然后在每个片段被创建时,提供对该共用 ViewModel 的访问。
这样,这三个组件将共同访问一个共享的生命周期感知对象,你可以用它来进行轻松的互相通信。
英文:
You should look into ViewModel: ViewModel Overview.
You should initialize a ViewModel in your parent activity and then when each Fragment is created, provide access to that common ViewModel.
All 3 components will then have shared access to a common lifecycle-conscious object that you can use for easy intercommunication.
答案2
得分: 0
这是解决方案 -_-,我不知道为什么之前不起作用。
在 FragmentA
内的 onClick
方法中,在末尾粘贴以下内容:
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.nav_host_fragment, galleryFragment);
transaction.addToBackStack(null);
transaction.commit();
我发布这个供需要的人使用。
英文:
this is the solution -_-, I dont know why before didnt work.
Inside of FragmentA
in the onClick
method, paste this at the end:
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.nav_host_fragment, galleryFragment);
transaction.addToBackStack(null);
transaction.commit();
I post this for who need it
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论