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

我正在创建一个程序,我需要在其中创建所有不同Android组件的列表,而不是手工识别和键入List 。 我想以编程方式弄清楚我是否可以完成此操作以添加到String Arrays中,如下所示?

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

类似地,我想以编程方式创建所有不同数据types的列表 ,例如Int,String,ArrayList等,以添加到String Arrays,如下所示

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

到目前为止我能做的就是上面。 到目前为止,我一直在打字,如上所述。

我怎么能做到这一点? 谢谢

澄清

按数据types:我的意思是声明保存数据的variablestypes,例如Int,String,object,boolean,double,arrays,arraylists等。

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

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

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

Solutions Collecting From Web of "如何以编程方式动态创建所有Android ui组件的列表? 例如TextView,ImageView等"

您不必使用任何第三方库 ,因为Java有reflection 。 此方法将为您完成所有操作并使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; } 

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

它的一个问题是,除了ViewViewGroup之外,还有更多的types。 但它还取决于你想要创建多少种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; } 

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

您可以使用reflection库将所有类的UI组件列入android.view包或android.view.View子类:

 Reflections reflections = new Reflections("android.view"); //Reflections reflections = new Reflections("android.view.View"); Set> allClasses = reflections.getSubTypesOf(Object.class); 

要创建所有数据types的列表,您可以使用Object类执行相同的操作,但首先,我个人会问自己,这样做的重点是什么。

Reflections是一个很棒的Java库。 我不确定它是否适用于Android。 有人打开了一个问题 ,很快就关闭了,没有任何解释。

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

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

如果需要,可以使用android.view包重复此过程,其中包含ViewGroup等其他类。

此外,如果您真的想要一个字符串数组,请获取类的名称:

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


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

如何使用Factory创建这样的组件:

 public class ComponentFactory { private HashMap mMap; public ComponentFactory(Context context) { mMap = new HashMap(); mMap.put("TextView", new TextView(context)); ... ... } public View getComponent(String name) { View v = mMap.get(name); if (v == null) { throw new IlllegalArgumentException(); } return v; } }