Загрузка активности из строковой переменной - PullRequest
1 голос
/ 08 января 2020

Я создаю приложение, в котором отображаются вопросы, и я сохранил следующий номер вопроса в базе данных, чтобы пользователь мог возобновить его в любое время.

Моя проблема заключается в том, что я получаю следующий номер вопроса из DB и добавьте число в строковую переменную, чтобы goNextQuestion было равно Question# (# - это число из DB).

Затем я хочу передать эту переменную, например, она равна на Question2, на новую функцию Intent для загрузки действия, связанного с этим вопросом.

Вот код из 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

Ответы [ 2 ]

1 голос
/ 08 января 2020

вы можете попробовать что-то вроде ниже.

, если вы используете Простое имя класса, например 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>
0 голосов
/ 08 января 2020

Вы не положили .class

  final String goQuestion = "Question" + lastQuestion;

Попробуйте это

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();
                }
            }
        });
...