【问题标题】:Fragment communicating with an Activity与 Activity 通信的 Fragment
【发布时间】:2015-07-23 10:07:06
【问题描述】:

我对如何与 Fragment 和 Activity 进行通信感到困惑。例如,此处定义了一个接口 (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 中实现的 onArticleSelected 方法的 Log 之前被 HeadlineFragment 中的 onListItemClick 方法调用。是预期的吗?

【问题讨论】:

  • 您错过了 Activity 将侦听器设置为片段的方法

标签: java android android-fragments interface


【解决方案1】:
  1. 由于您仅使用一种方法定义了OnHeadlineSelectedListener 接口,并且您的活动实现了它,因此当您将活动用作此接口的实例时,选择方法没有歧义,因为您在使用它时对活动一无所知作为OnHeadlineSelectedListener 接口的实例,其中存在onArticleSelected(int) 方法。
  2. 这取决于您何时调用日志记录函数 - 在调用回调方法之前或之后。

附:虽然 Activity 和 Fragment(或任何其他对象)之间的这种通信非常好,但我个人更喜欢Event Bus 方法,因为它使我们能够以低耦合的方式组织代码。以下是Event Bus 模式的一些不错的实现:

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

【讨论】:

  • +1 表示 EventBus 方法。顺便说一句,GreenRobot 的 EventBus 非常简单但功能强大,我真的推荐它!
【解决方案2】:

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

【讨论】:

  • 你说的太对了!谢谢你结束了我这几天的痛苦。
【解决方案3】:

关于你的第一部分问题

你应该看看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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多