目的是字段(EditText,Spinner,RadioGroup等)和GUI(布局/视图)完全基于字符串动态创建(存储在数据库中的字段ID的名称)意味着每个字符串将表示将用于区分的字段ID所有个别领域。
我有一个字符串说,
String fieldName = "etAccountNo"; //id "etAccountNo" of field is placed in string "fieldName".
现在我想以编程方式创建一个新的EditText字段,其变量名称为etAccountNo(将用于解释android中的EditText),即
fieldName = new EditText(context); //error here Incompatible types. required String but found EditText
手段
//etAccountNo = new EditText(context); //error here
我理解这个错误,但我需要这个目标的可能解决方案。
由于GUI是以编程方式/动态创建的,因此我必须添加字段属性,如setLayoutParams和setText等。例如
etAccountNo.setText"My Field";
基于注释您可以动态创建GUI,并可以使用id的数据库映射它们,而不是使用相同的变量。通过在db中保留字符串的id,并将相同的id设置为您创建的相应视图
如果要实现此目的,可以动态创建视图,然后将与字符串关联的引用存储在数据库中。
示例:
Hashtable<String, View> views = new Hashtable<>();
EditText et1 = new EditText(context);
views.put("etAccountNo", et1);
EditText et2 = new EditText(context);
views.put("blablabla", et2);
完成后,您可以使用字段名称访问您的视图到数据库中:
EditText accountNo = (EditText)views.get("etAccountNo");
我能想到的最好的解决方案是创建一个工厂类,可以将各种String
s映射到View
s。例如:
public static View getViewForString(String string, Context context) {
switch(string) {
case "TextView":
return new TextView(context);
case "ListView":
return new ListView(context);
}
}
要么:
static <V extends View> Optional<V> getView(String name, Context context, Class<V> c){
V view = null;
switch (name) {
case "TextView":
view = c.cast(new TextView(context));
break;
}
return Optional.ofNullable(view);
}
但这非常可怕,我鼓励您探索其他填充UI的方法。
由于它是以编程方式生成的View,因此它不具有id值。你可以用view.setId()
自己指定一个 - 所以,你可以使用view.setId("TextView".hashCode())
或view.setId(View.generateViewId())
。