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

Posted

技术标签:

【中文标题】如何从 java/android 中的字符串变量创建字段 ID【英文标题】:How to create field ID from string variable in java/android 【发布时间】:2017-12-20 15:00:51 【问题描述】:

目的是字段(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";

【问题讨论】:

您遇到什么错误?发布您的日志和正确的代码 不兼容的类型。必需的字符串,但找到了 EditText 这是不可能的,但我很好奇你为什么要这样做。你想解决什么问题?例如,变量的名称是为了程序员的利益,但您想在运行时进行更改……所以名称无关紧要。 您将字符串分配为 Edittext。这就是“不兼容类型”的原因。 你能发布你想要做什么的代码吗? 【参考方案1】:

基于评论 您可以动态创建 GUI,并可以将它们与数据库中的 id 映射,而不是使用相同的变量。通过将字符串的 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);

完成后,您可以使用数据库中的字段名称访问您的视图:

EditText accountNo = (EditText)views.get("etAccountNo");

【讨论】:

这可能是我正在寻找的,但我需要验证它 不,兄弟,etAccountNo 应该是 EditText 的字段 id。即 EditText etAccountNo = (EditText)views.get("etAccountNo");因为我需要进一步使用这个变量作为字段 id。 @AbdulSaleem 我认为这是解决您问题的好方法。可能你没看懂HashTable的观点?【参考方案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。

因为它是一个以编程方式生成的视图,它不会有一个 id 值。您可以使用view.setId() 自己分配一个 - 因此,您可以使用view.setId("TextView".hashCode())view.setId(View.generateViewId())

【讨论】:

我怎样才能获得新视图的 id?或者我如何分配同名的 id,因为我必须进一步处理视图 id 因为它是一个以编程方式生成的View,我不相信它会有一个 id 值。您可以使用view.setId() 自己分配一个 - 因此,您可以使用view.setId("TextView".hashCode())view.setId(View.generateViewId()) 看起来不错。请在答案详细信息中添加您的最后评论。 为什么它很可怕? 请详细说明如何从活动中调用视图?

以上是关于如何从 java/android 中的字符串变量创建字段 ID的主要内容,如果未能解决你的问题,请参考以下文章

从 Java Android 中的嵌套 JSON 对象获取数据

如何从 Java 中的另一个数组创建子数组?

如何从 java / android 中的嵌套 json 对象访问数据? [复制]

如何从 MATLAB 中的矩阵创建子矩阵(全部 5*5)?

如何从Java Android中的嵌套JSON获取数据

如何在不创建子外壳的情况下将命令的输出存储在变量中 [Bash <v4]