Si tengo una clase de actividad llamada TestActivity en mi aplicación, ¿hay alguna manera de obtener su clase por su nombre como en este ejemplo?
Class<?> c = getClassByName("TestActivity");
Respuestas:
Class<? extends SomeClass>
?
Puede usar Class::forName
para obtener un objeto de clase de tipo desconocido. Si desea obtener una clase escrita, puede usarla Class::asSubclass
en la clase devuelta por Class::forName
:
Class<? extends Activity> activityClass = Class.forName("com.example.TestActivity")
.asSubclass(Activity.class);
Por supuesto, también tendrá que manejar un montón de tipos diferentes de excepciones. Como es habitual cuando se trata de reflexión.
El Class.forName parece tener excepciones. Esto es solo para ampliar lo anterior para abordar este problema.
try { t = Class.forName("com.package.classname"); } catch (Exception ignored){}
También tenía un requisito similar, tenía un json proveniente del backend que contiene la pantalla y el mapeo de actividades. Dado que el json es común para iOS / Android, no pudimos agregar términos como Activity
en el json, así que esto es lo que hicimos
En json para todos Activity
o Viewcontrollers
, use nombres simples, es decir, para HomeActivity
y HomeViewController
usaremos "Inicio" en el json
En la aplicación, analizamos el json y he escrito los siguientes métodos de utilidad para obtener la actividad de forma dinámica
Para obtener el nombre de la clase (es decir, si pasamos a Inicio, volveremos com.package.HomeActivity
)
fun getClassInfoFor(name: String, context: Context):String{
var str = "${context.getPackageName()}.${name}Activity"
return str
}
Ahora para obtener la clase de la cadena
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()
}
De esta manera puedo administrar fácilmente varias clases con el mismo método. Utilizo esto en una vista de reciclador donde cada una de mis células navega hacia una actividad diferente.