片段与活动进行通信

时间:2015-07-23 10:07:07

标签: java android android-fragments interface

我对如何与片段和活动进行交流感到困惑。例如,此处定义了一个接口(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
    }
}

我的问题是:

  1. mCallback"如何知道"哪个onArticleSelected方法调用(因为可能有其他类已经实现了OnHeadlineSelectedListener)。

    mCallback.onArticleSelected(position);
    

    如果它发生了我不会感到困惑:

    mCallback = new OnHeadSelectedListener() {
        @Override
        public void onArticleSelected(int position)
            // Do something
        }
    

    然后在MainActivity中以某种方式引用mCallback以某种方式利用onArticleSelected方法。然而,在示例代码中,该行智能地坚持"""接口。这是怎么发生的?

  2. 此外,我发现从MainActivity实现的ArticleSelected方法的Log I先前被调用到HeadlineFragment中的onListItemClick方法中。是预期的吗?

3 个答案:

答案 0 :(得分:1)

  1. 由于您只使用一种方法定义了OnHeadlineSelectedListener接口,并且您的活动实现了它,因此当您将活动用作此接口的实例时,选择方法时没有任何歧义,'因为使用它作为OnHeadlineSelectedListener接口的实例,所有你对活动的了解都是onArticleSelected(int)方法的存在。
  2. 这取决于您何时调用日志记录功能 - 在调用回调方法之前或之后。
  3. P.S。虽然Activity和Fragment(或任何其他对象)之间的这种通信非常好,但我个人更喜欢Event Bus方法,因为它使我们有可能以低耦合方式组织代码。以下是Event Bus模式的一些很好的实现:

    如果您对此方法感兴趣,请查看它们。

答案 1 :(得分:0)

您的mCallback是您的活动,在片段的onAttach方法中,您将活动设置为片段的侦听器。通过这种方式,通常在调用mCallback.onArticleSelected(position)时通知活动是正常的;

答案 2 :(得分:0)

问题的第一部分

您应该查看onAttachonDetach方法 -

 @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