将侦听器重置为父活动以重建碎片

时间:2014-01-12 21:05:53

标签: android android-fragments android-activity listener

我正在使用一种模式,其中活动是其片段的监听器。我创建附加这些片段的原始方式是这样的:

MyFragment myFragment = new MyFragment(param1, param2)
myFragment.setListener(this);
getSupportFragmentManager().beginTransaction().replace(R.id.fragmentContainer, myFragment).commit()

但是我已经知道这是错误的,我应该使用静态newInstance()方法创建片段,以防片段被销毁,然后它可以从bundle重新创建。这将让我保留参数,但我的问题是如何将片段的监听器设置为其父活动,在销毁之后再重新创建?

是否像调用一样简单:

setListener((MyActivity) getActivity());
片段内的

?这对我来说似乎是错误的,因为它将片段强烈地耦合到其父活动。

2 个答案:

答案 0 :(得分:4)

这绝对是错误的路线。你应该让你的Activity实现Fragment的界面(它看起来好像你已经是,但无论如何我都会展示一个例子)。然后,在Fragment中,将Activity转换为onAttach()中的侦听器,并在onDetach()中释放它。一个简单的例子是:

片段

public class ExampleFragment extends Fragment {
    private MyFragmentInterface mInterface;

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

        if (activity instanceof MyFragmentInterface) {
            mInterface = (MyFragmentInterface) activity;
        } else {
            throw new IllegalArgumentException("Parent Activity must implement MyFragmentInterface.");
        }
    }

    @Override
    public void onDetach() {
        super.onDetach();
        mInterface = null;
    }

    private void fireOnSomethingHappened () {
        if (mInterface != null) {
            mInterface.onSomethingHappened();
        }
    }

    public static interface MyFragmentInterface {
        void onSomethingHappened();
    }
}

活动

public class ExampleActivity extends Activity implements ExampleFragment.MyFragmentInterface {
    @Override
    public void onSomethingHappened() {
        //Handle the event
    }
}

答案 1 :(得分:0)

newInstance()方法应返回一个片段实例,以便您可以执行以下操作:

MyFragment myFragment = MyFragment.newInstance(param1, param2)
myFragment.setListener(this);
getSupportFragmentManager().beginTransaction().replace(R.id.fragmentContainer,    myFragment).commit();