我如何dynamic创build一个所有的Android UI组件的编程列表? 如TextView,ImageView等

我正在创build一个程序,在这个程序中,我需要创build一个所有不同Android组件的列表,而不是用手工计算和input列表 。 我想通过编程来弄清楚我是否可以将它添加到如下所示的string数组中?

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

同样,我想以编程方式创build一个所有不同的数据types的列表 ,例如Int,String,ArrayList等被添加到像下面的string数组

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

上面我已经能够做到了 。 到目前为止,我一直在按照上面的方法打字。

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

澄清

通过数据types:我的意思是声明variablestypes保存数据,例如INT,string,对象,布尔,双,数组,ArrayList等

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

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

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

Solutions Collecting From Web of "我如何dynamic创build一个所有的Android UI组件的编程列表? 如TextView,ImageView等"

你不必使用任何第三方库 ,因为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()

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

而已。 你有一切处理任何forms的View我已经testing了上面的代码,并在项目中使用。 它工作得很好。 与其他Object完全相同的情况。 你不能用reflection来创buildint ,但是你可以创buildInteger ,所以基本上是一样的。

它的一个问题有更多的types比ViewViewGroup 。 但它也取决于你想创build多less种Object …在给定的例子中,让我们说我会做charStringintObject ,然后你可以很容易地扩展它。

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

由于所有这些数据types都在同一个包中,所以对我们来说更容易。 方法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; } 

如果需要的话,可以为不同的包制作一种方法。 如果将来您想要创build更多不同types的variables,而这些types的variables位于不同的包中,则必须检查名称或执行类似于View的示例中的操作。

您可以使用reflection库将所有类的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); 

要创build一个所有数据types的列表,你可以使用Object类做同样的事情,但首先,我个人会问自己这是干什么的。

思考是一个很棒的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); 

如果你愿意的话,你可以用android.view包来重复这个过程,其中一些其他类如ViewGroup所在的位置。

此外,如果你真的想要一个string数组,获取类的名称:

 List<String> componentNames = new ArrayList<String>(); for (Class<? extends View> c: components) { componentNames.add(c.getName()); } String[] allComponents = componentNames.toArray(); 


如果上述解决scheme不适合您,请尝试从官方网站获取课程。 这些类在android.view和android.widget包中列出。 只需复制相关名称并将其粘贴到源代码中。 这不会是dynamic的,但它的工作原理。

如何使用工厂来创build这样的组件:

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