我正在创建一个程序,我需要在其中创建所有不同 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、arrays、arraylists 等。
组件:我的意思是可以添加到 Android xml 中的任何可视组件,例如ImageView、TextView、LinearLayout、RelativeLayout等
是的,我知道这些组件的数量可以是无限的(由正在使用的 API 决定),我想为此动态生成它们
最好不要使用别人的库
最佳答案
您不必使用任何第三方库,因为 Java
有 reflections .
此方法将为您完成所有工作并使 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
,所以基本上是一样的。
其中一个问题是,除了View
和ViewGroup
之外,还有更多类型。但这也取决于您要创建多少种 Object
... 在给定的示例中,假设我将执行 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()
:
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
s。
关于java - 如何以编程方式动态创建所有 Android ui 组件的列表?例如 TextView 、 ImageView 等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30449441/