gpt4 book ai didi

java - fragment 与 Activity 通信

转载 作者:行者123 更新时间:2023-11-30 02:00:20 27 4
gpt4 key购买 nike

我对如何与 Fragment 和 Activity 进行通信感到困惑。例如,这里定义了一个接口(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 方法。然而,在示例代码中,该行智能地贴在“一个”接口(interface)上。这是怎么发生的?

  2. 此外,我发现我在 MainActivity 中实现的 onArticleSelected 方法中的 Log 被调用到 HeadlineFragment 中的 onListItemClick 方法中。是预期的吗?

最佳答案

  1. 由于您只使用一个方法定义了 OnHeadlineSelectedListener 接口(interface),并且您的 Activity 实现了它,因此当您将 Activity 用作此接口(interface)的实例时,选择方法不会有歧义,因为您知道关于将其用作 OnHeadlineSelectedListener 接口(interface)实例时的 Activity 是其中存在 onArticleSelected(int) 方法。
  2. 这取决于您何时调用日志记录函数 - 在调用回调方法之前或之后。

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

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

关于java - fragment 与 Activity 通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31584230/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com