活动类预告片

时间:2014-10-17 12:27:58

标签: java android android-activity android-fragmentactivity downcast

我有2个不同的活动可以“实例化”相同的片段。 在片段内部,我需要保存对容器活动的引用。

MyActivity1 extends FragmentActivity
MyActivity2 extends FragmentActivity

引用存储在Fragment类字段中。 我不能通用:

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更智能的方式来做到这一点?希望我的问题很明确。

2 个答案:

答案 0 :(得分:1)

它没有帮助,因为您将转换分配给泛型类型而不是特定的

if (getActivity() instanceof MyActivity1) {
    ((MyActivity1) getActivity()).mMethod1(); 
} else if (getActivity() instanceof MyActivity2) {
    ((MyActivity2) getActivity()).mMethod2();  
}

我建议你有一个带抽象方法的抽象类,以及这个类的两个具体扩展,它们提供了自己的抽象方法实现。在这种情况下,您可以保留对抽象类的引用,并将方法调用转发到正确的具体实例

答案 1 :(得分:1)

例如只有MyActivity1mMethod1(),您每次将其调用到正确的班级时都需要投放activity。恕我直言,两个领域的方法听起来更好。

代码可能类似于:

if (getActivity() instanceof MyActivity1) {
    activity = (MyActivity1) getActivity();
    ((MyActivity1) activity).mMethod1();
} else {
    activity = (MyActivity2) getActivity();
    ((MyActivity2) activity).mMethod2();
}

或者,您可以声明定义mMethod()的接口,并让两个活动实现该接口。然后您可以:

interface MyActivityInterface {
    public void mMethod();
}

MyActivityInterface activity;

// ...

if (getActivity() instanceof MyActivity1) {
    activity = (MyActivityIntercface) getActivity();
} else {
    activity = (MyActivityIntercface) getActivity();
}

activity.mMethod();

HTH,