Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/215.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 与活动通信的片段_Java_Android_Android Fragments_Interface - Fatal编程技术网

Java 与活动通信的片段

Java 与活动通信的片段,java,android,android-fragments,interface,Java,Android,Android Fragments,Interface,我对如何与片段和活动进行通信感到困惑。例如,这里定义了一个接口() 最后,从MainActivity调用以下方法 public static class MainActivity extends Activity implements HeadlinesFragment.OnHeadlineSelectedListener{ ... public void onArticleSelected(int position) { // Do something

我对如何与片段和活动进行通信感到困惑。例如,这里定义了一个接口()

最后,从MainActivity调用以下方法

public static class MainActivity extends Activity
    implements HeadlinesFragment.OnHeadlineSelectedListener{
    ...

    public void onArticleSelected(int position) {
        // Do something
    }
}
我的问题是:

  • mCallback如何“知道”要调用哪个onArticleSelected方法(因为可能还有其他类在HeadlineSelectedListener上实现)

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

    mCallback = new OnHeadSelectedListener() {
        @Override
        public void onArticleSelected(int position)
            // Do something
        }
    
    然后在MainActivity中以某种方式引用mCallback,以某种方式利用onArticleSelected方法。然而,在示例代码中,该行智能地粘附到“an”接口。这是怎么发生的

  • 此外,我发现我在MainActivity中的ArticleSelected方法上实现的日志在HeadlineFragment中的onListItemClick方法中被调用。这是预期的吗


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

  • 由于您仅使用一种方法定义了HeadlineSelectedListener的
    接口,并且您的活动实现了该接口,因此当您将活动用作此接口的实例时,选择该方法没有任何歧义,'因为在将活动用作
    OnHeadlineSelectedListener
    接口的实例时,您所知道的关于它的所有信息都是其中存在
    onArticleSelected(int)
    方法
  • 这取决于何时调用日志函数—在调用回调方法之前或之后
  • 另外,虽然活动和片段(或任何其他对象)之间的这种通信非常好,但我个人更喜欢
    事件总线
    方法,因为它使我们能够以低耦合的方式组织代码。下面是
    事件总线
    模式的一些不错的实现:


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

    关于问题的第一部分

    您应该看看
    onAttach
    onDetach
    方法-

     @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;
        }
    
    第二部分- 这种行为是不可预料的。
    您不应该将活动类设置为静态的。

    您遗漏了一件事,即活动将侦听器设置为事件总线方法的片段+1。顺便说一句,GreenRobot的EventBus非常简单但功能强大,我真的推荐它!你说得太对了!谢谢你结束了我这几天的痛苦。
    mCallback = new OnHeadSelectedListener() {
        @Override
        public void onArticleSelected(int position)
            // Do something
        }
    
     @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;
        }