Java 如何以编程方式动态创建所有Android ui组件的列表?e、 g.文本视图、图像视图等

Java 如何以编程方式动态创建所有Android ui组件的列表?e、 g.文本视图、图像视图等,java,android,android-layout,android-intent,android-activity,Java,Android,Android Layout,Android Intent,Android Activity,我正在创建一个程序,我需要在其中创建一个包含所有不同Android组件的列表,而不是手工计算并键入列表。我想以编程的方式弄清楚我是否可以完成这项任务,并将其添加到如下字符串数组中 Components[] = {"TextView", "ImageView", "RelativeLayout", "LinearLayout", "Random", "DecimalFormat ... 类似地,我希望通过编程创建一个包含所有不同数据类型(例如Int、String、ArrayList等)的列表,添

我正在创建一个程序,我需要在其中创建一个包含所有不同Android组件的列表,而不是手工计算并键入列表。我想以编程的方式弄清楚我是否可以完成这项任务,并将其添加到如下字符串数组中

Components[] = {"TextView", "ImageView", "RelativeLayout", "LinearLayout", "Random", "DecimalFormat ...
类似地,我希望通过编程创建一个包含所有不同数据类型(例如Int、String、ArrayList等)的列表,添加到字符串数组中,如下所示

DataTypes[] = {"Int", "String", "Object", "Double", "Char", "Boolean ...
到目前为止我所能做的如上所述。到目前为止,我一直在按上面的方式把它们打印出来

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

澄清

按数据类型:我是指声明用于保存数据的变量类型,例如Int、String、object、boolean、double、array、arraylists等

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

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


最好不使用其他人的库

您可以使用以下方法将所有类的UI组件列出到包或子类中:

Reflections=newreflections(“android.view”);
//反射=新反射(“android.view.view”);
Set是一个很棒的Java库。我不确定它是否也适用于Android。有人,它很快就关闭了,没有任何解释

如果您可以让它在Android中工作,您可以使用此代码获取所有组件:

Reflections reflections = new Reflection("android.widget") //specifiy the package (TextView etc. are in here)
Set<Class<? extends View>> components = reflections.getSubTypesOf(View.class);

如果上述解决方案不适用于您,请尝试从官方网站获取课程。这些类在包和中列出。只需复制相关名称并将其粘贴到源代码中即可。这不是动态的,但它是有效的。

您不必使用任何第三方库,因为
Java
有。 此方法将为您做所有事情,并使
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()

就这样。您可以处理任何类型的
视图
我已经测试了上面的代码并在项目中使用。它工作正常。 与其他
对象的情况完全相同。不能使用反射创建
int
,但可以创建
Integer
,所以基本上是一样的

它的一个问题是类型远远不止
视图
视图组
。但这也取决于您要创建多少种
对象
s。。。在给定的示例中,假设我将执行
char
String
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()

如果需要,可以为不同的包制作一种方法。
如果将来您想创建更多不同类型的变量,这些变量位于不同的包中,那么您必须检查名称或执行类似的操作,例如使用
视图
s.

如何使用工厂创建如下组件:

public class ComponentFactory {
    private HashMap<String, View> mMap;
    public ComponentFactory(Context context) {
        mMap = new HashMap<String, View>();
        mMap.put("TextView", new TextView(context));
        ...
        ...
    }

    public View getComponent(String name) {
        View v = mMap.get(name);
        if (v == null) {
            throw new IlllegalArgumentException();
        }
        return v;
    }
}
公共类组件工厂{
私有HashMap-mMap;
公共组件工厂(上下文){
mMap=新的HashMap();
mMap.put(“文本视图”,新文本视图(上下文));
...
...
}
公共视图getComponent(字符串名称){
视图v=mMap.get(名称);
如果(v==null){
抛出新的IlllegalArgumentException();
}
返回v;
}
}

您想要一个所有Android中存在的所有这些组件的列表,或者仅仅是应用程序中使用的组件和数据类型?从编程角度来说,所有Android中存在的组件都需要一个列表您想要在不使用ListView的情况下创建一个UI组件的列表吗?只需发布您目前能够做的事情。您能定义类是“组件”的原因吗是什么使它成为“数据类型”?我们如何为创建的元素提供操作,例如,如果我想从编辑文本中获取文本或从微调器中获取选定项?如果你有样品,请在这里分享
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;
}
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);
    }
}
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;
}
public class ComponentFactory {
    private HashMap<String, View> mMap;
    public ComponentFactory(Context context) {
        mMap = new HashMap<String, View>();
        mMap.put("TextView", new TextView(context));
        ...
        ...
    }

    public View getComponent(String name) {
        View v = mMap.get(name);
        if (v == null) {
            throw new IlllegalArgumentException();
        }
        return v;
    }
}