Android 开发的循环继承 - 片段、活动和接口

Cyclic inheritance with Android development - fragments, activities and interfaces

我有一个包含多个片段的应用程序和一个管理它们的 activity。为了避免片段之间的耦合,所有交互和更改都经过 activity - 但这是我的问题 - 我在以下情况下遇到循环继承编译时错误:

简而言之:

 class A extends Z implements B.listenerB, C.listenerC // cyclic inheritance involving A
 class B extends Y implements A.listenerA  //cyclic inheritance involving B
 class C extends Y implements A.listenerA  // cyclic inheritance involving A

长:

    public class Fragment1 extends Fragment implements Activity1.onCustomEventListenerActivity {
           onCustomEventListenerFrag1 listener1;

        public interface onCustomEventListenerFrag1{
         void onCustomEventinFrag1();
        }

        public void someAction(){
           if (successful) 
               listener1.onCustomEvent(); //notify the activity of success
        }

        @Override
        public void onCustomEvent(){
            //respond to change from activity
        }
}

这是我的例子Activity:

public class Activity1 extends FragmentActivity implements Fragment1.onCustomEventListenerFrag1, Fragment2.onCustomEventListenerFrag2{

    //Listens to events in the Activity
    onCustomEventListenerActivity mListener;
    public interface onCustomEventListenerActivity{
       void onCustomEvent();
    }

    @Override
    public void onCustomEventinFrag1(){
        // notify Frag2
        mListener.onCustomEvent();
     }

     @Override
        public void onCustomEventinFrag2(){
        // some code
     }

     public void someAction(){
        if (successful) 
        mListener.onCustomEvent();
     }
}

还有我的另一个片段:

public class Fragment2 extends Fragment implements Activity1.onCustomEventListenerActivity {

    //Listens to some event in Frag2
    onCustomEventListenerFrag2 listener2;
    public interface onCustomEventListenerFrag2{
        void onCustomEventinFrag2();
    }

    //Said event
    public void someAction(){
        if (successful)
            listener2.onCustomEventinFrag2(); //notify the activity of success
    }

    //Responding to an event in the activity
    @Override
    public void onCustomEvent(){
        //change something in the fragment
    }
}

如何在保持片段之间松散耦合的同时避免此错误?例如,我可以将所有接口包装在一个 class 中,并使每个 class 实现所需的接口(如果是,如何实现)?我看过其他循环耦合的例子,但我的理解似乎不是这种情况。

编辑:我想我明白了为什么会出现错误,但仍然 - 从某个 class 实现接口与继承所述 class 一样吗?

谢谢!

好的,正确地提出问题实际上让我明白了我的错误在哪里 - B 和 C 依赖于 A,而 A 又有一些部分依赖于 B 和 C。一个解决方法,实际上 - 一个更优化的解决方案是不要让片段观察 activity ,而只是声明一些 public 方法来改变片段。然后,当 activity 观察到其任何片段发生变化时,它可以通过搜索应在其中进行更改的正确片段并调用其 public 方法来做出响应。这样我就避免了创建太多不必要的监听器..

所以为了更清楚,它会是:

class A extends Z implements A.listenerA, B.listenerB{
     @Override
     onEventinA(){
          B fragB = (B)getSupportFragmentManager().findFragmentById(R.id.fragBid);
          if (fragB == null){
                fragB = B.newInstance();
          }
          fragB.makeChange();
      }

      onEventinB(){
          A fragA = (A)getSupportFragmentManager().findFragmentById(R.id.fragAid);
          if (fragA == null){
                fragA = A.newInstance();
          }
          fragA.makeChange();
      }
 }

and Fragments 与问题中的几乎相同,但没有实现 activity 中的任何侦听器,并且添加了 public 方法。

对我来说,我也为你着想。请注意,如果您有一个嵌套在 class 中的接口 class,那么嵌套。如果您这样做并且有两个 class 正在使用它,您将收到此错误。只需将界面移至单独的文件中,不要将其嵌入 class 中。这将使错误消失。