在android中传递片段和活动之间的对象数据

pat*_*ats 0 android android-fragments

我想在活动和片段以及片段和片段之间传递一个复杂的对象.目前,主活动创建一个片段输入对象,并将其设置为需要打开的片段的成员.类似地,当另一个片段想要加载另一个片段时,它会创建片段输入并通知主要活动.请参阅下面的主要和子片段代码.我的问题是,这是正确的实施.有时我在子活动中遇到输入为null,如果活动暂停并重新启动.

请告诉我我做错了什么,是传递数据的最佳方式.

 public class FragmentInput {

    public String url = "";
    public String title = "";
    public String time = "";
     ... other memebers
}
Run Code Online (Sandbox Code Playgroud)

主要活动

fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager
                            .beginTransaction();
 BaseFragment fragment = new LandingFragment();
 **FragmentInput input = new FragmentInput();
 input.stringinput = stringinput;
 fragment.input = input;
 fragmentTransaction.replace(R.id.fragment, fragment);
 fragmentTransaction.commit();**



    public void replaceFragment(BaseFragment fragment) {

            if (fragment == null)
                return;

            if (fragment instanceof firstFragment) {
                FragmentTransaction fragmentTransaction = fragmentManager
                        .beginTransaction();
                fragmentTransaction.setCustomAnimations(0, 0);

                fragmentManager.popBackStackImmediate(null,
                        FragmentManager.POP_BACK_STACK_INCLUSIVE);

                fragmentTransaction.addToBackStack(null);
                fragmentTransaction.commit();

            } else {

                String ttag = fragment
                        .getClass().toString();

                Fragment tempF = fragmentManager.findFragmentByTag(ttag);
                if (tempF != null)
                    return;
                FragmentTransaction fragmentTransaction = fragmentManager
                        .beginTransaction();
                fragmentTransaction.setCustomAnimations(R.anim.fragment_enter,
                        R.anim.fragment_exit, R.anim.fragment_leftenter,
                        R.anim.fragment_leftexit);

                fragmentTransaction.replace(R.id.fragment, fragment, ttag);
                fragmentTransaction.addToBackStack(null);
                fragmentTransaction.commit();
            }


        }
Run Code Online (Sandbox Code Playgroud)

ChildFragment

@Override
    public void onActivityCreated(Bundle bundle) {
        super.onActivityCreated(bundle);
        try {
            activity = getActivity();
            resource = activity.getResources();
            view = getView();

            **if (input != null) {
                String url= input.url;**

       button.onclick(){
            FragmentInput input = new FragmentInput();
            input.url = path;
            input.title = resource.getString(R.string.txt_from_gallery);

            **BaseFragment fr = new otherFragment();
            FragmentChangeListener fc = (FragmentChangeListener)     getActivity();
            fr.setInput(input);
            fc.replaceFragment(fr);**
}
}
Run Code Online (Sandbox Code Playgroud)

sav*_*ion 6

如果您的片段附加到相同的活动,您可以将对象存储在活动中并访问对象,如下所示:

((YourActivity)getActivity()).getYourObjects();
Run Code Online (Sandbox Code Playgroud)

如果你在你的活动中将你的对象存储在bundle中,我建议你调用你在片段的onActivityCreated()方法中给出的代码示例,以避免空指针异常.

如果要在bundle中的活动或片段之间传递对象.您应该将Parcelable实现为对象并传递它们.

什么是Parcelable? http://developer.android.com/reference/android/os/Parcelable.html

Parcelable效率更高,但您可以查看Serializable:http: //developer.android.com/reference/java/io/Serializable.html

在bundle中传递大型对象并不是一个好的设计.

您也可以使用接口传递对象,也可以使用总线事件传递它们.你可以检查番石榴或奥托布斯. http://square.github.io/otto/