什么是startActivityForResult()的模拟,但使用片段

时间:2013-05-19 06:43:29

标签: android android-fragments

我有4个标签,每个标签在选中时会运行一个片段 从标签#2片段我想开始另一个片段在标签#2上运行并从中获取结果。这样做的正确方法是什么?周围有什么例子吗?

如果那些是活动,而不是片段,我知道我会使用startActivityForResult()。

1 个答案:

答案 0 :(得分:5)

有一种推荐的片段交互模式。每个片段都声明了使用界面与其他片段交互的方式:

这是第一个片段的代码:

public class Fragment1 {
    private Listener listener;

    @Override
    public void onCreateView(...) {
        Bundle args=getArguments();            
        if (args!=null) {
            Object arg=args.getParcelable("result");
            //use the result for something
        }

        //...
        someView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (listener!=null)
                    listener.onFragment2Requested();
            }
        });
        //...
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);

        this.listener=(Listener) activity;
    }

    public interface Listener {
        public void onFragment2Requested();
    }
}

和第二个片段:

public class Fragment2 {
    private Listener listener;

    @Override
    public void onCreateView(...) {
        //...
        someView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Object object=...

                if (listener!=null)
                    listener.onWorkDone(object);
            }
        });
        //...
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);

        //will throw ClassCastException unless your Activity
        //implements Listener interface of your fragment
        this.listener=(Listener) activity;
    }

    public interface Listener {
        public void onWorkDone(Object someResult);
        public void someOtherMethod();
    }
}

然后,最后,你的Activity,作为协调员:

public class YourActivity extends 
                              FragmentActivity 
                          implements 
                              Fragment1.Listener, 
                              Fragment2.Listener {

    public void onFragment2Requested() {
        Fragment2 frg2=new Fragment2();
        //here goes your code to switch fragments the way you want    
    }

    public void onWorkDone(Object someResult) {
        //if you don't want to create new instance of fragment each time
        //you can try to get it from FragmentManager.
        //But don't try to store reference to it anywhere (activity field etc.)
        //it could interfere with fragment recycling mechanism
        Fragment1 frg1=new Fragment1();
        Bundle args=new Bundle();
        args.putParcelable("result", someResult);
        //instead of arguments, you could use setter method, but that way 
        //your Object is lost when fragment is recreated upon orientation change, etc.
        frg1.setArguments(args);
        //here goes your code to switch fragments the way you want
    }

    public void someOtherMethod() {
        //...
    }
}

我知道,这可能看起来太多代码,但这就是它的完成方式。 此外,此模式还包括in this article