我对如何与片段和活动进行通信感到困惑。例如,此处定义了一个接口(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);时通知活动是正常的。

08-17 23:41