Java 如何以编程方式动态创建所有Android ui组件的列表?e、 g.文本视图、图像视图等
我正在创建一个程序,我需要在其中创建一个包含所有不同Android组件的列表,而不是手工计算并键入列表。我想以编程的方式弄清楚我是否可以完成这项任务,并将其添加到如下字符串数组中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等)的列表,添
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;
}
}