【问题标题】:Cyclic inheritance with Android development - fragments, activities and interfacesAndroid开发的循环继承——片段、活动和接口
【发布时间】:2015-09-02 12:18:15
【问题描述】:

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

简而言之:

 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
        }
}

这是我的示例活动:

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
    }
}

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

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

谢谢!

【问题讨论】:

  • 将接口解压到自己的接口文件中

标签: java android-fragments interface callback event-listener


【解决方案1】:

对我来说,我也为你想。请注意,如果您有一个嵌入在类中的接口类,那么是嵌套的。如果你这样做并且有两个类正在使用它,你会得到这个错误。只需获取接口并将其移动到单独的文件中,不要将其嵌入到类中。这将消除错误。

【讨论】:

    【解决方案2】:

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

    所以为了更清楚一点:

    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();
          }
     }
    

    和片段将与问题中的几乎相同,但没有从活动中实现任何侦听器并添加到公共方法。

    【讨论】:

      猜你喜欢
      • 2016-05-18
      • 1970-01-01
      • 1970-01-01
      • 2012-10-28
      • 1970-01-01
      • 2015-06-22
      • 1970-01-01
      • 2010-09-21
      相关资源
      最近更新 更多