我对如何与片段和活动进行通信感到困惑。例如,此处定义了一个接口(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方法。但是,在示例代码中,该行会智能地停留在“ an”界面上。怎么发生的?
另外,我发现我从MainActivity实现的onArticleSelected方法中的Log先前已被HeadlineFragment中的onListItemClick方法中的Log调用。是预期的吗?
最佳答案
您的mCallback是您的活动,在片段的onAttach方法中,您会将活动设置为片段的侦听器。这样,当您调用mCallback.onArticleSelected(position);时通知活动是正常的。