英文:
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
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论