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

问题描述 投票:0回答:2

目的是字段(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";
java android field textfield programmatically-created
2个回答
2
投票

基于注释您可以动态创建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");

2
投票

我能想到的最好的解决方案是创建一个工厂类,可以将各种Strings映射到Views。例如:

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())

© www.soinside.com 2019 - 2024. All rights reserved.