Java 活动类向下广播
我有两个不同的活动可以“实例化”相同的片段。 在片段中,我需要保存对容器活动的引用Java 活动类向下广播,java,android,android-activity,android-fragmentactivity,downcast,Java,Android,Android Activity,Android Fragmentactivity,Downcast,我有两个不同的活动可以“实例化”相同的片段。 在片段中,我需要保存对容器活动的引用 MyActivity1 extends FragmentActivity MyActivity2 extends FragmentActivity 引用存储在片段类字段中。 我不能是泛型的: private Activity activity; 然后: activity = getActivity(); 这样,我就无法使用为自定义MyActivity1/MyActivity2实现的方法。 向下广播似乎也没什
MyActivity1 extends FragmentActivity
MyActivity2 extends FragmentActivity
引用存储在片段类字段中。
我不能是泛型的:
private Activity activity;
然后:
activity = getActivity();
这样,我就无法使用为自定义MyActivity1/MyActivity2实现的方法。
向下广播似乎也没什么帮助:
if (getActivity() instanceof MyActivity1) {
activity = (MyActivity1) getActivity();
activity.mMethod1(); // NOPE
} else {
activity = (MyActivity2) getActivity();
activity.mMethod2(); // NOPE
}
我应该使用两个字段(每个活动类型一个)并保留一个空白吗?
有没有更聪明的java方法?希望我的问题是清楚的。这没有帮助,因为您将强制转换指定给的是泛型类型,而不是特定类型
if (getActivity() instanceof MyActivity1) {
((MyActivity1) getActivity()).mMethod1();
} else if (getActivity() instanceof MyActivity2) {
((MyActivity2) getActivity()).mMethod2();
}
我建议您拥有一个带有抽象方法的抽象类,以及该类的两个具体扩展,它们提供了抽象方法的各自实现。在这种情况下,您可以保留对抽象类的引用,并且方法调用将转发到正确的具体实例,因为例如,只有
MyActivity1
具有mMethod1()
,所以每次调用正确的类时,您都需要强制转换activity
。两个字段的方法听起来更好
代码可能类似于:
if (getActivity() instanceof MyActivity1) {
activity = (MyActivity1) getActivity();
((MyActivity1) activity).mMethod1();
} else {
activity = (MyActivity2) getActivity();
((MyActivity2) activity).mMethod2();
}
或者,您可以声明一个定义mMethod()
的接口,并让这两个活动实现该接口。。然后你可以有:
interface MyActivityInterface {
public void mMethod();
}
及
嗯,是的,但我需要一个参考,以便在类的其他方法中进一步使用,所以我需要两个字段?我明白了,这样你就必须始终检查并转换为确切的类型,它没有那么漂亮。若我是,我会有一个抽象的MyActivity类,带有一个抽象的方法。MyActivity1和MyActivity2扩展了MyActivity并提供了抽象方法的实现。因此,您可以保留对MyActivity的引用,正确的方法将被称为Dok,嗯,我在这两个活动中有多个不同的方法,其中一些方法没有在另一个活动中实现。这取决于视图。您还可以有一个空方法。我知道,这不是世界上最好的事情,但方法不多。。总而言之,我无法告诉你设计应用程序的最佳方式:)使用私人碎片活动;代替私人活动;它不工作,我不能调用子类特定的方法。
MyActivityInterface activity;
// ...
if (getActivity() instanceof MyActivity1) {
activity = (MyActivityIntercface) getActivity();
} else {
activity = (MyActivityIntercface) getActivity();
}
activity.mMethod();