安卓:如何通过编程设置编辑框或文本视图的ID

13

我正在开发一个应用程序,其中我通过编程方式创建一个EditText:

EditText edText = new EditText(this);
edText.setId(1);
edText .setLayoutParams(new TableLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT,0f));
edText .setInputType(InputType.TYPE_CLASS_NUMBER);
edText.setHint("dsgsdgsgs");
tableLayout.addView(edText);

这里我通过代码edText.setId(1);将EditText的id设置为整数"1"。

但是我需要的是 - 我想要将ID以字符形式设置,例如:

edText.setId("edittext_hello");

我希望能够通过该ID访问它。请问我该如何实现这个任务,请帮忙。

6个回答

25

就像其他人所说,你不能这样做。你为什么想要这样做/你的要求是什么?

如果您想要描述性的ID,可以在xml文件中创建一个id并使用它。这也比使用文字int更好,因为您可能会在布局层次结构的其他视图中遇到id冲突(不太可能但有可能)。对我来说,这似乎是解决您问题的最佳/最清洁的方法。

请参见http://developer.android.com/guide/topics/resources/more-resources.html#Id

例如,在res/values/id.xml中。

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <item
        type="id"
        name="edittext_hello" />
</resources>

然后设置为

edText.setId(R.id.edittext_hello);

如果您根据属性文件动态创建元素,那么如何将属性文件中的ID动态地设置给每个创建的元素呢? - FLBKernel
好的,我已经想通了。只需要拥有你设置标签元素的父级引用,然后就可以使用标签找到它。例如: LinearLayout linearLayout= (LinearLayout) findViewById(R.id.sale_aditionals_layout); 然后 MaterialEditText materialEditText = (MaterialEditText) linearLayout.findViewWithTag(entry.getKey()); - FLBKernel

20

您无法将id设置为字符串。您只能分配整数作为Id。但是,如果您想使用字符串作为id以便于使用,则可以在 res/values/ids.xml 文件中进行如下操作-

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <item name="edit_text_hello" type="id"/>

</resources>

然后将其用作:

edText.setId(R.id.edit_text_hello);

那么你可以做你需要做的事情。


10
这是那个名叫 Dori 的人的答案副本!没什么值得添加的,对吧? - Andy B
3
我同意 :( 而且它被标记为答案 - 有点烦人! - Dori
如果您根据属性文件动态创建了元素,那么该如何将属性文件中的ID动态地设置给每个已创建的元素呢? - FLBKernel
好的,我已经想通了。只需要拥有你设置标签元素的父级引用,然后就可以使用标签找到它。例如: LinearLayout linearLayout= (LinearLayout) findViewById(R.id.sale_aditionals_layout); 然后 MaterialEditText materialEditText = (MaterialEditText) linearLayout.findViewWithTag(entry.getKey()); - FLBKernel

4

您不能使用charString或任何其他类型的参数设置id,只能使用int类型,因为id是由R.java文件维护的,该文件仅包含int

您可以使用setTag()代替setId()

使用以下方式使用setTag()...

edText.setTag("edittext_hello");

4
不,您不能将“id”设置为字符串。只能将整数分配为ID。您可以使用View的setTag()与字符串一起使用。但对于ID,它只是整数。因为Android资源在R.java文件中维护为整数类型。
更新:
为什么不将字符串或其他数据类型(而非整数)ID设置为任何android资源?
因为:
Android资源ID是32位整数。它包括
an 8-bit Package id [bits 24-31]
an 8-bit Type id [bits 16-23]
a 16-bit Entry index [bits 0-15]

包ID标识包含资源的包块。

类型ID标识资源的类型,因此对应于包含其值或值的Typespec块和Type块或块。

条目索引标识Typespec块和Type块中的单个资源。


请查看http://developer.android.com/guide/topics/resources/more-resources.html#Id。 - user370305

2

你可以在不创建任何额外资源(如ids.xml)和不给创建的动态EditText设置任何id的情况下,解决你的问题。

只需要获取你已经添加了标签的元素的父级引用,然后就可以通过标签找到它了。

父级

LinearLayout linearLayout= (LinearLayout) findViewById(R.id.layout_id);

然后

子级

EditText editText = (EditText) linearLayout.findViewWithTag("yourStringTag");

例如...

注意:如果你是动态地创建EditTexts,那么你会像这样做:

for (Map.Entry<String, String> entry : yourHashMap.entrySet()) {

LinearLayout linearLayout= (LinearLayout) findViewById(R.id.parent_layout_id);

EditText editText = (EditText) linearLayout.findViewWithTag(entry.getKey());

// Then do whatever you want with your editText referenced.
// ...

}

-3

你可以使用setText()代替setId()。

edText_view.setText("你的文本");


问题是关于如何添加ID而不是文本。 - Ananta Prasad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接