活动开关方法



我正在尝试制作ActivitySwitch方法。我的看法是这样:

public class ActivityUtil extends Activity{
    public static void goToActivity(Context contextOfActivity, Class secondActivityClass){
        startActivity(new Intent(contextOfActivity, secondActivityClass));
    }
}

我想使其静态,因为切换活动实际上并不需要。

我有几个问题:

  1. 是否有从非静态调用静态方法的解决方法?
  2. 如何将课程作为参数?我的代码给了我一个错误。我有正确的导入语句。

我得到了此警告:"类是一种原始类型。引用对通用类型类的参考应该被参数化"

从非静态上下文中调用静态方法没有问题:

ActivityUtil.goToActivity(...);

您可能意味着在静态上下文中调用非静态方法。您必须在传递的Context对象上称其为参数:

contextOfActivity.startActivity(new Intent(contextOfActivity, secondActivityClass.class));

要通过Class对象您必须执行:

ClassName.class

关于 Class通用参数警告

首先,有两种简单的方法可以获取Class实例,一个静态和一个动态:

    ActivityUtil.goToActivity(activity, ActivityToStart.class);  // static, refers a member of a _class_
    ActivityUtil.goToActivity(activity, activityToStart.getClass());  // dynamic, calls a method on an object _instance_

"类是原始类型"警告是指 generics 参数(或类型参数),而不是与例如相混淆。方法参数。您绝对需要阅读有关Java Generic的信息,但是您会发现Class类是这样声明的:

java.lang.Class<T>

<T>部分是警告所指的参数。此T在编译时间替换为给定类型,该类型 you 根据您的用例决定:

Class<String> c1 = String.class;  //c1's T refers to the type String
Class<ExampleClass> c2 = ExampleClass.class;  //c2's T refers to the type ExampleClass that you have defined in your code

c1c2都是类Class的实例,但用StringExampleClass进行了参数。

因此,在您的代码中,您尚未指定secondActivityClassT的类型,因此编译器不知道该替换为什么并发出警告,因为它无法确定您是否不会在运行时有问题。因此,您需要采取的措施来删除警告,以指定t的值,例如如果您不知道会是什么:

Class<?> secondActivityClass

注意?代表T的"任何类型"。

话虽如此,编译器不必知道这里是什么,因为它不会产生任何影响,因此您不应该看到此警告。我尝试了主意,但没有任何警告。也许有些编译器会这样做,但我想您没有粘贴您看到警告的确切代码。

关于静态上下文

的非静态上下文访问

无需从任何地方调用static的方法,它们只是可召唤的。我想您可能会忘记在电话中陈述课程,请尝试以下操作:

    ActivityUtil.goToActivity(activity, class);

我认为您还遇到了另一个问题,要调用"非静态"方法,您需要取消对象以运行该方法。例如,在您的情况下,您想做:

public static void goToActivity(Context context, Class<?> secondActivityClass){
    context.startActivity(new Intent(context, secondActivityClass));
}

注意context.零件,该部分指的是您运行的startActivity()的实例。

用更简单的单词, goToActivity()是静态的,因此从类执行, startActivity()不是静态的,因此从实例执行。

startActivity(new Intent(contextOfActivity, secondActivityClass));

这是由编译器有效地翻译成:

this.startActivity(new Intent(contextOfActivity, secondActivityClass));

,但是由于您处于静态上下文(Java上下文,而不是Android),因此您没有任何this参考,并且根本没有编译。


顺便说一句,我建议您三思而后行。实现的方法仅是一行,不太可能改变,只会使代码更难阅读和更混乱。Android为您提供了一种简单的方法来在活动之间"切换",不要将其包装到您自己的情况下变得复杂...

尝试使您的代码像这样

 startActivity(new Intent(this , secondActivityClass.class));

,但我认为您会在活动上下文中遇到静态问题,尝试删除静态关键字

也许使用静态字段保存一个实例:

private static Activity instance;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    instance = this;
}
public static void goToActivity(Context context, Class secondClass) {
    instance.startActivity(new Intent(context, secondClass));
}

编辑:当然,正确的解决方案是不使用静态方法,只需从您的活动实例中调用startActivity()。

这意味着您必须通过上下文。

例如,如果此代码启动活动在另一个类中:

class MyCode {
    void doStuff() {
        //stuff
        // need to start activity here
    }
}

修改此上下文,无论是dostuff()还是最好是obejct的构造函数(消除冗余上下文参数),然后当您从活动中使用它时:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    MyCode code = new MyCode(this);
    code.doStuff();
}

您可以更改dostuff(),然后更改为:

public class MyCode {
    Context mContext;
    public MyCode(Context context) {
        mContext = context;
    }
    void doStuff() {
        //stuff
        // need to start activity here
        mContext.startActivity(....)
    }
}

这将是可取的,因为否则使用静态方法,也许未设置实例?那什么?

您需要通过周围的上下文。

相关内容

最新更新