在android

时间:2015-11-10 11:18:00

标签: android android-fragments

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

请告诉我我做错了什么,最好的方法是传递数据。

 public class FragmentInput {

    public String url = "";
    public String title = "";
    public String time = "";
     ... other memebers
}

主要活动

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();
            }


        }

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);**
}
}

2 个答案:

答案 0 :(得分:6)

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

((YourActivity)getActivity()).getYourObjects();

如果你在你的活动中将你的对象存储在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/

答案 1 :(得分:2)

在这种情况下,您可以使用静态持有者(它有点类似于单例模式)。

创建一个新类

public class Holder
{
    private static FragmentInput input = null;

    public static void setInput(FragmentInput value) { this.input = value; }
    public static FragmentInput getInput() { return input; }
}

在主活动中,创建新的FragmentInput对象后 把它放在持有人身上

Holder.setInput(input);

您可以随时随地访问它,只需致电

FragmentInput myInput = Holder.getInput();