如何在java/android中从字符串变量创建字段ID

如何在java/android中从字符串变量创建字段ID,java,android,field,textfield,programmatically-created,Java,Android,Field,Textfield,Programmatically Created,其目的是基于字符串(存储在数据库中的字段id名称)动态创建字段(EditText、微调器、RadioGroup等)和GUI(布局/视图),这意味着每个字符串将表示用于区分所有单个字段的字段id 我有话要说 String fieldName = "etAccountNo"; //id "etAccountNo" of field is placed in string "fieldName". 现在我想以编程方式创建一个新的EditText字段,其变量名为etAccountNo(将用于在andr

其目的是基于字符串(存储在数据库中的字段id名称)动态创建字段(EditText、微调器、RadioGroup等)和GUI(布局/视图),这意味着每个字符串将表示用于区分所有单个字段的字段id

我有话要说

String fieldName = "etAccountNo"; //id "etAccountNo" of field is placed in string "fieldName".
现在我想以编程方式创建一个新的EditText字段,其变量名为etAccountNo(将用于在android中解释EditText) i、 e

意味着

我理解这个错误,但我需要这个目标的可能解决方案

由于GUI是以编程/动态方式创建的,所以我必须添加字段属性,如setLayoutParams和setText等

etAccountNo.setText"My Field";
根据注释,您可以动态创建GUI,并可以将它们与id为的数据库中的GUI进行映射,而不是使用相同的变量。通过将字符串的id保留在db中,并将相同的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);
根据注释,您可以动态创建GUI,并可以将它们与id为的数据库中的GUI进行映射,而不是使用相同的变量。通过将字符串的id保留在db中,并将相同的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);

我能想到的最佳解决方案是创建一个工厂类,它可以将各种
字符串
s映射到
视图
s。例如:

public static View getViewForString(String string, Context context) {
    switch(string) {
        case "TextView":
            return new TextView(context);
        case "ListView":
            return new ListView(context);
    }
}
或:

静态可选getView(字符串名称、上下文、类c){
V view=null;
交换机(名称){
案例“TextView”:
view=c.cast(新文本视图(上下文));
打破
}
返回可选。不可用(视图);
}
但这非常可怕,我鼓励您探索其他填充UI的方法


由于它是以编程方式生成的视图,因此不会有id值。但是,您可以使用
view.setId()
,自己分配一个,因此,您可以使用
view.setId(“TextView.hashCode())
,或者
view.setId(view.generateWiid())

我能想到的最佳解决方案是创建一个工厂类,它可以将各种
字符串映射到
视图。例如:

public static View getViewForString(String string, Context context) {
    switch(string) {
        case "TextView":
            return new TextView(context);
        case "ListView":
            return new ListView(context);
    }
}
或:

静态可选getView(字符串名称、上下文、类c){
V view=null;
交换机(名称){
案例“TextView”:
view=c.cast(新文本视图(上下文));
打破
}
返回可选。不可用(视图);
}
但这非常可怕,我鼓励您探索其他填充UI的方法



由于它是以编程方式生成的视图,因此不会有id值。但是,您可以使用
view.setId()
-这样,您就可以使用
view.setId(“TextView.hashCode())
,或者
view.setId(view.generateWid())
,您遇到了什么错误?发布您的日志以及正确的代码不兼容类型。必需字符串,但找到EditTextThis不可能,但我很好奇您为什么要这样做。你想解决什么问题?例如,变量的名称是为了程序员的利益,但您希望在运行时进行更改…因此名称并不重要。您可以将字符串指定为Edittext。这就是“不兼容类型”的原因。你可以发布你的代码,说明你正在尝试做什么。你会得到什么错误?发布您的日志以及正确的代码不兼容类型。必需字符串,但找到EditTextThis不可能,但我很好奇您为什么要这样做。你想解决什么问题?例如,变量的名称是为了程序员的利益,但您希望在运行时进行更改…因此名称并不重要。您可以将字符串指定为Edittext。这就是“不兼容类型”的原因。你可以发布你的代码,说明你正在尝试做什么。这可能是我正在寻找的,但我需要验证它否Bro,etAccountNo应该是EditText的字段id。i、 e.EditText etAccountNo=(EditText)views.get(“etAccountNo”);因为我需要进一步使用这个变量作为字段id。@AbdulSaleem我认为这是解决问题的一个好办法。也许您不了解views哈希表的要点?这可能是我想要的,但我需要验证它否Bro,etAccountNo应该是EditText的字段id。i、 e.EditText etAccountNo=(EditText)views.get(“etAccountNo”);因为我需要进一步使用这个变量作为字段id。@AbdulSaleem我认为这是解决问题的一个好办法。也许您不了解视图哈希表的要点?如何获取新视图的id?或者我如何分配相同名称的id,因为我必须处理视图id,因为它是通过编程生成的
视图
,我不相信它会有id值。但是,您可以使用
view.setId()
,自己分配一个,这样,您就可以使用
view.setId(“TextView.hashCode())
,或者
view.setId(view.generateWid())
。看起来很棒。请在回答细节中添加您的最后一条评论。为什么这很糟糕?请详细说明如何从活动中调用视图?以及如何获取新视图的id?或者我如何分配相同名称的id,因为我必须处理视图id,因为它是通过编程生成的
视图
,我不相信它会有id值。但是,您可以使用
view.setId()
,自己分配一个,这样,您就可以使用
view.setId(“TextView.hashCode())
,或者
view.setId(view.generateWid())
。看起来很棒。请在回答细节中添加您的最后一条评论。以及为什么它很可怕?请详细说明如何从活动中调用view?
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);
}