我是Android编程世界的新手,这是我的问题。
假设我有一个名为A
的活动和一个名为F
的碎片。我知道Activity
和Fragment
之间的互动应该通过Interface
完成。我过去常常在Interface
的{{1}}中设置onAttach()
Fragment
现在听说here来自@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
mListener = (MyListenerInterface) activity;
}
。
我的问题是:这是init的最佳方法。听众? Static Factory Method
方法或通过静态工厂方法初始化监听器,像这样?。
onAttach()
我认为,最好通过public static MyFragment newInstance(MyListenerInterface mListener) {
MyFragment f = new MyFragment();
this.mListener = mListener;
...........
return f;
}
初始化侦听器而不是从活动中转换,因此我们可以避免空指针异常。
答案 0 :(得分:1)
是的,您不需要通过工厂投放任何内容,但我认为onAttach
更好,因为您泄漏活动上下文的机会较少。让我们假设您使用工厂创建一个实例并且从不使用该片段,它将泄漏Activity的上下文,并且其中包含所有内容。另外,请不要忘记销毁onDetach
中的界面。
此外,您可以拥有该片段的许多实例,并且使用选项1,它们都将具有相同的侦听器,而不是很好。
此外,你应该制作一个你可以称之为BaseActivity
的东西,一个所有其他扩展的抽象活动,并在那里定义接口方法,你将避免总是转向很多不同的类。如果您需要在应用的每个活动中快速更改某些内容,这也会派上用场。
答案 1 :(得分:1)
第一个选项(在OnAttach()
中初始化侦听器)是一个更好的选项,因为
MyListenerInterface
是一个非静态变量,因此每个片段都有自己的监听器。MyListenerInterface
变量是一个静态的,它是在类级保持的引用,并且对于所有其他的片段实例都是通用的,这会导致在不同的活动中需要相同的片段时出现问题一项活动的听众将被另一项活动所覆盖。