gpt4 book ai didi

java - 从字符串变量加载 Activity

转载 作者:行者123 更新时间:2023-11-30 05:20:35 25 4
gpt4 key购买 nike

我正在开发一个应用程序,其中显示问题,并将下一个问题编号存储在数据库中,以便用户可以随时继续。

我的问题是我从数据库中获取下一个问题编号并将该编号附加到字符串变量中,因此 goNextQuestion 等于 Question# (# 是来自数据库的编号)。

然后,我想将该变量(例如,它等于 Question2)传递给新的 Intent 函数以加载与该问题关联的 Activity 。

这是 Home.class 中的代码:

button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
try {
final String goQuestion = "Question" + lastQuestion";
startActivity(new Intent(Home.this, Class.forName(goQuestion)));
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
});

完整的 Home.class 可以在这里查看:https://pastebin.com/6mbrBpQm

我的预期结果是它的加载方式与我刚刚将 Question2.class 传递到 Intent 中时的加载方式相同。但是,出现错误,catch 语句执行时始终出现以下错误:

W/System.err: java.lang.ClassNotFoundException: Question2.class
at java.lang.Class.classForName(Native Method)
at java.lang.Class.forName(Class.java:400)
at java.lang.Class.forName(Class.java:326)
at uk.co.jrtevents.k_quiz.Home$1.onClick(Home.java:45)
W/System.err: at android.view.View.performClick(View.java:5610)
at android.view.View$PerformClick.run(View.java:22265)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
Caused by: java.lang.ClassNotFoundException: Didn't find class "Question2.class" on path: DexPathList[[zip file "/data/app/uk.co.jrtevents.k_quiz-1/base.apk"],nativeLibraryDirectories=[/data/app/uk.co.jrtevents.k_quiz-1/lib/x86, /system/lib, /vendor/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
at java.lang.ClassLoader.loadClass(ClassLoader.java:380)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
... 13 more

解决这个问题的最佳方法是什么?

链接到 Question2.class:https://pastebin.com/5sdsc1Ec

最佳答案

您可以尝试如下所示的操作。

如果您使用Simple类名称,例如Step8CompletedActivity,那么它将给出错误。

var clazz =
Class.forName(Step8CompletedActivity::class.java.simpleName!!).kotlin as KClass<Activity>

会出现以下错误

java.lang.ExceptionInInitializerError
at com.google.samples.motionlayoutcodelab.MainActivityKt.access$getData$p(MainActivity.kt:1)
at com.google.samples.motionlayoutcodelab.MainActivity.onCreate(MainActivity.kt:114)
at android.app.Activity.performCreate(Activity.java:6662)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
Caused by: java.lang.ClassNotFoundException: Step8CompletedActivity
at java.lang.Class.classForName(Native Method)
at java.lang.Class.forName(Class.java:400)
at java.lang.Class.forName(Class.java:326)
at com.google.samples.motionlayoutcodelab.MainActivityKt.<clinit>(MainActivity.kt:39)
at com.google.samples.motionlayoutcodelab.MainActivityKt.access$getData$p(MainActivity.kt:1) 

而不是使用简单名称,仅使用规范名称或带路径的全名

var clazz =
Class.forName(Step8CompletedActivity::class.java.canonicalName!!).kotlin as KClass<Activity>

或者使用下面的方法会产生相同的结果。

 var clazz =
Class.forName("com.google.samples.motionlayoutcodelab.Step8CompletedActivity").kotlin as KClass<Activity>

关于java - 从字符串变量加载 Activity ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59648592/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com