Jeśli w mojej aplikacji mam klasę Activity o nazwie TestActivity, czy istnieje sposób na pobranie jej klasy według nazwy, tak jak w tym przykładzie:
Class<?> c = getClassByName("TestActivity");
Odpowiedzi:
użyj zamiast tego forName ...
coś takiego..
try {
Class<?> act = Class.forName("com.bla.TestActivity");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Class<? extends SomeClass>
?
Możesz użyć, Class::forName
aby uzyskać obiekt klasy nieznanego typu. Jeśli chcesz uzyskać wpisaną klasę, możesz użyć Class::asSubclass
na klasie zwróconej przez Class::forName
:
Class<? extends Activity> activityClass = Class.forName("com.example.TestActivity")
.asSubclass(Activity.class);
Oczywiście będziesz musiał również poradzić sobie z wieloma różnymi typami wyjątków. Jak zwykle w przypadku refleksji.
Class.forName wydaje się mieć na niej wyjątki. To jest tylko rozwinięcie powyższego, aby rozwiązać ten problem.
try { t = Class.forName("com.package.classname"); } catch (Exception ignored){}
Miałem też podobny wymóg, miałem json pochodzący z zaplecza, który zawiera mapowanie ekranu i aktywności. Ponieważ json jest wspólny dla systemów iOS i Android, nie mogliśmy dodać takich terminów Activity
do json, więc to właśnie zrobiliśmy
W json dla wszystkich Activity
lub Viewcontrollers
użyj prostych nazw, tj. Dla HomeActivity
i HomeViewController
użyjemy „Home” w pliku json
W aplikacji analizujemy json i napisałem poniższe metody narzędziowe, aby dynamicznie uzyskać aktywność
Aby uzyskać nazwę klasy (tj. Jeśli miniemy Home, wrócimy com.package.HomeActivity
)
fun getClassInfoFor(name: String, context: Context):String{
var str = "${context.getPackageName()}.${name}Activity"
return str
}
Teraz, aby pobrać klasę ze stringa
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()
}
W ten sposób mogę łatwo zarządzać wieloma zajęciami za pomocą tej samej metody. Używam tego w widoku recyklera, w którym każda moja komórka kieruje się do innej czynności.