我对如何与片段和活动进行交流感到困惑。例如,此处定义了一个接口(https://developer.android.com/training/basics/fragments/communicating.html)。
public class HeadlinesFragment extends ListFragment {
OnHeadlineSelectedListener mCallback;
// Container Activity must implement this interface
public interface OnHeadlineSelectedListener {
public void onArticleSelected(int position);
}
...
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
// The user clicked on a list item.
mCallback.onArticleSelected(position);
}
}
最终,从MainActivity调用以下方法。
public static class MainActivity extends Activity
implements HeadlinesFragment.OnHeadlineSelectedListener{
...
public void onArticleSelected(int position) {
// Do something
}
}
我的问题是:
mCallback"如何知道"哪个onArticleSelected方法调用(因为可能有其他类已经实现了OnHeadlineSelectedListener)。
mCallback.onArticleSelected(position);
如果它发生了我不会感到困惑:
mCallback = new OnHeadSelectedListener() {
@Override
public void onArticleSelected(int position)
// Do something
}
然后在MainActivity中以某种方式引用mCallback以某种方式利用onArticleSelected方法。然而,在示例代码中,该行智能地坚持"""接口。这是怎么发生的?
此外,我发现从MainActivity实现的ArticleSelected方法的Log I先前被调用到HeadlineFragment中的onListItemClick方法中。是预期的吗?
答案 0 :(得分:1)
OnHeadlineSelectedListener
接口,并且您的活动实现了它,因此当您将活动用作此接口的实例时,选择方法时没有任何歧义,'因为使用它作为OnHeadlineSelectedListener
接口的实例,所有你对活动的了解都是onArticleSelected(int)
方法的存在。 P.S。虽然Activity和Fragment(或任何其他对象)之间的这种通信非常好,但我个人更喜欢Event Bus
方法,因为它使我们有可能以低耦合方式组织代码。以下是Event Bus
模式的一些很好的实现:
如果您对此方法感兴趣,请查看它们。
答案 1 :(得分:0)
您的mCallback是您的活动,在片段的onAttach方法中,您将活动设置为片段的侦听器。通过这种方式,通常在调用mCallback.onArticleSelected(position)时通知活动是正常的;
答案 2 :(得分:0)
问题的第一部分
您应该查看onAttach
和onDetach
方法 -
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mCallbacks = (OnHeadlineSelectedListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException("Activity must implement OnHeadlineSelectedListener.");
}
}
@Override
public void onDetach() {
super.onDetach();
mCallbacks = null;
}
第二部分 -
这种行为是不可预期的。
您也不应该制作活动班级static
。