Wenn ich in meiner Anwendung eine Aktivitätsklasse namens TestActivity habe, gibt es eine Möglichkeit, die Klasse anhand ihres Namens wie in diesem Beispiel zu ermitteln:
Class<?> c = getClassByName("TestActivity");
Antworten:
Class<? extends SomeClass>?
Sie können verwenden Class::forName, um ein Klassenobjekt unbekannten Typs abzurufen. Wenn Sie eine typisierte Klasse erhalten möchten, können Sie diese Class::asSubclassfür folgende Klasse verwenden Class::forName:
Class<? extends Activity> activityClass = Class.forName("com.example.TestActivity")
.asSubclass(Activity.class);
Natürlich müssen Sie auch eine Reihe verschiedener Arten von Ausnahmen behandeln. Wie beim Umgang mit Reflexion üblich.
Die Class.forName scheint Ausnahmen zu haben. Dies dient nur dazu, das oben Gesagte zu erweitern, um dieses Problem zu beheben.
try { t = Class.forName("com.package.classname"); } catch (Exception ignored){}
Ich hatte auch eine ähnliche Anforderung, ich hatte einen JSON aus dem Backend, der den Bildschirm und die Aktivitätszuordnung enthält. Da der JSON für iOS / Android gemeinsam ist, konnten wir dem JSON keine Begriffe wie hinzufügen Activity, also haben wir dies getan
Verwenden Sie in json für alle Activityoder Viewcontrollerseinfache Namen, dh für HomeActivityund HomeViewControllerwir verwenden "Home" im json
In der App analysieren wir den JSON und ich habe die folgenden Dienstprogrammmethoden geschrieben, um die Aktivität dynamisch abzurufen
Um den Namen der Klasse zu erhalten (dh wenn wir nach Hause kommen, werden wir zurückkommen com.package.HomeActivity)
fun getClassInfoFor(name: String, context: Context):String{
var str = "${context.getPackageName()}.${name}Activity"
return str
}
Nun, um Klasse aus String zu bekommen
try {
val className = Utilties.getClassInfoFor(activityNameFromJSON, context)
val fetchedClass = Class.forName(className)
val showDetailsIntent = Intent(context, fetchedClass)
context.startActivity(showDetailsIntent)
} catch (e: ClassNotFoundException) {
e.printStackTrace()
}
Auf diese Weise kann ich problemlos mehrere Klassen mit derselben Methode verwalten. Ich verwende dies in einer Recycler-Ansicht, in der jede Zelle zu einer anderen Aktivität navigiert.