java - 如何以编程方式动态创建所有 Android ui 组件的列表?例如 TextView 、 ImageView 等

标签 java android android-layout android-intent android-activity

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

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

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

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

到目前为止我能做的事情,就在上面。到目前为止,我一直在按上述方式将它们实际输入。

我怎样才能做到这一点?谢谢

澄清

数据类型:我是指声明为保存数据的变量类型,例如 Int、String、object、boolean、double、a​​rrays、arraylists 等。

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

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

最好不要使用别人的库

最佳答案

您不必使用任何第三方库,因为 Javareflections . 此方法将为您完成所有工作并使 UI 没有问题:

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;
}

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

其中一个问题是,除了ViewViewGroup 之外,还有更多类型。但这也取决于您要创建多少种 Object... 在给定的示例中,假设我将执行 charString, int, Object 然后你可以很容易地扩展它。

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;
}

如果需要,可以为不同的包创建一种方法。 如果将来您想创建更多不同类型的变量,它们位于不同的包中,那么您将必须检查名称或执行类似的操作,例如 Views。

关于java - 如何以编程方式动态创建所有 Android ui 组件的列表?例如 TextView 、 ImageView 等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30449441/

相关文章:

java - 使用 Netty 和 NIO 的高并发 HTTP

java - 通过其他线程更新 javafx 上的 listview

android - 在 Composable 函数之外引用或枚举 Jetpack Compose MaterialTheme 主题颜色

android - 在android中快速获取当前位置一次

java - 如果哈希码不同,为什么 HashSet 允许相同的项目?

java - 如何创建从根目录到文件完整路径的映射

android - 我的 Sprite 如何从 andEngine 中的当前位置旋转(平滑旋转)给定角度?

android - 改造滚动发光在填充之外

java - Android Studio 动态更改 GridView 中的图像

android - 不同型号手机的布局