如何以编程方式动态创建所有 Android UI 组件的列表?例如文本视图,图像视图等

我正在创建一个程序,在其中我需要创建所有不同Android组件的列表,而不是手动找出并键入列表。我想以编程方式弄清楚我是否可以完成此操作以添加到字符串数组中,如下所示?

Components[] = {"TextView", "ImageView", "RelativeLayout", "LinearLayout", "Random", "DecimalFormat ...

同样,我想以编程方式创建所有不同数据类型的列表,例如Int,String,ArrayList等,以添加到字符串数组中,如下所示

DataTypes[] = {"Int", "String", "Object", "Double", "Char", "Boolean ...

到目前为止,我能够做到的就是上面。到目前为止,我一直在像上面一样将它们打出来。

我该如何做到这一点?谢谢

澄清

按数据类型:我的意思是声明用于保存数据的变量类型,例如Int,字符串,对象,布尔值,双精度值,数组,数组列表等。

按组件:我的意思是任何可以添加到Android的xml中的视觉组件,例如ImageView,TextView,LinearLayout,RelativeLayout等。

是的,我知道这些组件的数量可以是无限的(由正在使用的API决定),为此我想动态生成它们

最好不要使用别人的图书馆


答案 1

您不必使用任何第三方库,因为具有反射。此方法将为您完成所有操作,并使没有问题:JavaUI

for(String s : arrayWithNames){
    View view = createViewInstance(0, s);
    if(view instance of View){
        //handle if it is view
    }else{
        //this is viewgroup
    }
}

和:createViewInstance()

private View createViewInstance(String name){
    View view = null;
    try{
        if(name.equalsIgnoreCase("View"){ // if it is view
            Class viewClass = Class.forName("android.view." + name);
            view = (View) viewClass.getConstructor(Context.class).newInstance(new Object[]{ctx});
        }else{ // if it is widget: ImageView, RelativeLayout etc
            Class viewClass = Class.forName("android.widget." + name);
            view = (View) viewClass.getConstructor(Context.class).newInstance(new Object[]{ctx});
        }
    } catch (ClassNotFoundException | InvocationTargetException | NoSuchMethodException
            | InstantiationException | IllegalAccessException e) {
        e.printStackTrace();
    }
    return view;
}

就是这样。你有一切来处理任何类型的.我已经测试了上面的代码并在项目中使用。它工作得很好。与其他 s 完全相同的情况。你不能用反射来创造,但你可以创造,所以基本上都是一样的。ViewObjectintInteger

它的一个问题是,除了 和 之外,还有更多的类型。但这也取决于你想创建多少种s...在给定的示例中,假设我将执行 , 、 ,然后您可以轻松扩展它。ViewViewGroupObjectcharStringintObject

for(String s : arrayWithNames){
    if(s.equalsIgnoreCase("int")){
        Integer integer = (Integer)createVarInstance(s); //ready to use. Integer, not int!
    }else if(s.equalsIgnoreCase("String"){
        String string = (String)createVarInstance(s);
    }else if(s.equalsIgnoreCase("char"){
        Character character = (Character)createVarInstance(s); //Character, not char!
    }else if(s.equalsIgnoreCase("Object"){
        Object object = (Object)createVarInstance(s);
    }
}

由于所有这些数据类型都在同一包中,因此对我们来说要容易得多。方法:createVarInstance()

private Object createVarInstance(String name){
    Object obj = null;
    try{
        Class varClass = Class.forName("java.lang." + name);
        object = (Object) varClass.newInstance();
    } catch (ClassNotFoundException | InvocationTargetException | NoSuchMethodException
            | InstantiationException | IllegalAccessException e) {
        e.printStackTrace();
    }
    return object;
}

如果需要,可以为不同的包制作一种方法。如果将来要创建更多不同类型的变量,这些变量位于不同的包中,因此您必须检查名称或执行与 示例中的示例类似的操作。View


答案 2

您可以使用反射库将所有类的 UI 组件列出到 android.view 包或 android.view.View 子类中:

Reflections reflections = new Reflections("android.view");
//Reflections reflections = new Reflections("android.view.View");

Set<Class<? extends Object>> allClasses = reflections.getSubTypesOf(Object.class);

要创建所有数据类型的列表,您可以使用th Object类在上面执行相同的操作,但首先,我个人会问自己这样做有什么意义。


推荐