如何在Android中以编程方式设置EditText的Id

3

我在GridLayout中有一个名为addnewTask的按钮。当你创建这个按钮时,它会创建一个EditText。

private GridLayout gridLayout;

int rowIndex = 3;
int colIndex = 1;

int i=0;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_set_task);

    gridLayout = (GridLayout) findViewById(R.id.taskLayout);

}

这个函数是当按钮被点击时创建 EditText 的。-->
public void addView(View view) {
    i++;
    String tname = "task" + Integer.toString(i);
    EditText editText = new EditText(this);
    GridLayout.LayoutParams param = new GridLayout.LayoutParams();
    param.height = ViewGroup.LayoutParams.WRAP_CONTENT;
    param.width = GridLayout.LayoutParams.MATCH_PARENT;
    param.rowSpec = GridLayout.spec(rowIndex);
    param.columnSpec = GridLayout.spec(colIndex);
    editText.setLayoutParams(param);
    if (rowIndex > 3) {
        editText.setTag(tname);
    }

    gridLayout.addView(editText);
    rowIndex++;
}

我的问题是我想设置我创建的EditText的android:id。
就像这样:当点击按钮时,创建EditText,在第3行第1列和id名称task1。
再次单击按钮时,将创建另一个EditText,在第4行第1列和id名称task2。
再次单击按钮时,在第5行第1列创建另一个EditText,并将其命名为task3。
以此类推...

为什么需要为这些“EditText”分配一个ID? - Rahul Tiwari
因为当用户在这些EditText中输入时,需要特定的ID来获取值并将其插入到数据库中。 - Ruby
而且这就是为什么每个创建的EditText都必须有一个唯一的id名称。 - Ruby
我不知道如何做那个。这就是为什么我在问如何做的原因。 - Ruby
@Raby:如何为每个特定的EditText使用专用的setOnFocusChangeListener呢?谢谢。 - AbdulSaleem
3个回答

5
在Android中,ID不是字符串 - 它们始终是数字。即使您在xml中编写@+id/textId,也会为此文本生成一个数字。您可以在R文件中看到这一点。
您可以使用editText.setId(int)方法为您的编辑文本分配ID。如果您想轻松地引用编辑文本,则可以:
  1. 按顺序分配ID:1、2、3等。然后项目的ID将为(row-1)*<columnsCount>+column(因此,如果您有3列,则第五行的第二个项目将具有ID 4 * 3 + 2)
  2. 创建类型为Map<String,Integer>的映射字段,再次按顺序分配ID,并将其保存在其中。
String tname = "task" + Integer.toString(i);   
EditText editText = new EditText(this);
editText.setId(i);
idsMap.put(tname, i);

您可以通过调用idsMap.get("task3")来获取edittext的ID。

第三个选项是将您的EditText引用保存在映射中:然后,您将拥有一个Map<String, EditText>映射,然后调用

String tname = "task" + Integer.toString(i);   
EditText editText = new EditText(this);
editTextsMap.put(tname, editText);

这是从哪里来的editTextsMap?-> Map<String, Integer> editTextsMap = new HashMap<String, Integer>(); - Ruby
@wasyl 有效的参数 :) - Rahul Tiwari
@wasyl,但是我如何获取我创建的每个EditText中的值?我必须获取这些值以便插入数据库。 - Ruby
样例 = (EditText) findViewById(R.id.task1); - Ruby
问题是给编辑文本分配ID。如果您在后续过程中遇到问题,请发布新问题。 - wasyl
显示剩余9条评论

0

您可以在数组中保留这些编辑文本的引用,表示为网格单元格。 像这样声明ArrayList:

ArrayList<EditText> etArray = new ArrayList<>();

在编程中,需要在addView方法的结尾处像这样将你的EditText引用存储在数组列表中:

etArray.add(i,edittext);

现在像这样引用这些视图:

etArray.get(i);

这样,您就可以引用它们以访问文本。

动态分配ID可能会导致问题,因为ID是整数,您分配的ID可能会与系统分配给其他组件的ID发生冲突。


什么?我不明白。 - Ruby
但是如何为创建的每个EditText设置ID? - Ruby
不需要为每个EditText设置id,这样做可能会引起问题。使用存储在数组中的原始引用引用它们将帮助您从EditText中获取所有数据,如答案所述。 - Rahul Tiwari

0

你不能将id设置为字符串。你只能分配整数作为Id。但是,如果你想使用字符串作为id以便于使用,那么可以在res/values/ids.xml文件中进行设置。

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

然后将其用作:

edText.setId(R.id.edit_text_hello); 这样你就可以做你需要的事情了。


https://dev59.com/iWEh5IYBdhLWcg3wVCPK - Frank Gue

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