我正在使用一种模式,其中活动是其片段的监听器。我创建附加这些片段的原始方式是这样的:
MyFragment myFragment = new MyFragment(param1, param2)
myFragment.setListener(this);
getSupportFragmentManager().beginTransaction().replace(R.id.fragmentContainer, myFragment).commit()
但是我已经知道这是错误的,我应该使用静态newInstance()方法创建片段,以防片段被销毁,然后它可以从bundle重新创建。这将让我保留参数,但我的问题是如何将片段的监听器设置为其父活动,在销毁之后再重新创建?
是否像调用一样简单:
setListener((MyActivity) getActivity());
片段内的?这对我来说似乎是错误的,因为它将片段强烈地耦合到其父活动。
答案 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();