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 中。这将使错误消失。
我有一个包含多个片段的应用程序和一个管理它们的 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 中。这将使错误消失。