有一段时间没有问问题了,所以已经迟到了!
我正在创建一个应用程序,可以在单击时创建作业项目,每个新行包含一个描述(EditText)、一个价格(EditText)和一个用于删除当前行的按钮,但我在获取值时遇到问题当有多于一行时,来自 EditText 字段 - 它只返回最新行的值。
除了“作业列表容器”之外, View 是动态创建的,因此请原谅缺少 XML,但我想要实现的结构如下,单击“添加”按钮会添加一行(这可以是多行)并单击提交按钮获取所有描述和价格值并处理它们(添加价格并将作业添加到数据库):
...这是我为它编写的从 addNewJobRow onClick 监听器调用的代码(为了简单起见,全部放在一起):
private void addJobItem() {
//Create a new row container
final LinearLayout jobRowContainer = new LinearLayout(this);
//Create a new EditText for the Description
final EditText description = new EditText(this);
description.setHint("Description...");
description.setLayoutParams(new LinearLayout.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT,
1.0f
));
//Create an EditText for the Price
final EditText price = new EditText(this);
price.setHint("00.00");
//Create a new button to delete the row
Button delete = new Button(this);
delete.setBackgroundColor(Color.RED);
delete.setText("X");
//Add Description, Price and Delete to the row container
jobRowContainer.addView(description);
jobRowContainer.addView(price);
jobRowContainer.addView(delete);
//Add the Row Container to the Jobs List Container
ll_jobListContainer.addView(jobRowContainer);
//Get the values of the Description and Price, for each row
btn_JobSubmit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
for (int i = 0; i < ll_jobListContainer.getChildCount(); i++) {
for(int j = 0; j < jobRowContainer.getChildCount(); j++) {
if (jobRowContainer.getChildAt(i) instanceof EditText){
String descriptionString = description.getText().toString();
String priceString = price.getText().toString();
System.out.println("z! " + descriptionString + " @ " + priceString);
}
}
}
}
});
}
我已经尝试了几次迭代,使用和不使用嵌套的 FOR
循环以及使用和不使用 instanceof
,但它所做的只是打印出最新行。
那么,如果我有多个作业行,如何获取所需的所有值?
感谢您的宝贵时间和所有这些好东西 xxx
最佳答案
基本问题是您仅使用 description
和 price
的最后一个实例,而不是每个行实例。 (这可能也是德米特里所说的)。要修复它,您需要获取每一行的输入。这是一种方法。
为描述
和价格
设置ID。 (不能只使用“1”或“2”,它必须是资源类型 ID,这样才能保证唯一)。我制作了一个行的虚拟布局文件,并将其中的 ID 分配给 2 个 EditText
。可能有更好的方法来做到这一点。所以无论如何,在你的声明中添加这两行
descripton.setId(R.id.description);
和 price.setId(R.id.price);
现在这是你的 onClick()
public void onClick(View v) {
for (int i = 0; i < ll_jobListContainer.getChildCount(); i++) {
LinearLayout currentRow = (LinearLayout)ll_jobListContainer.getChildAt(i);
EditText editText = (EditText)currentRow.findViewById(R.id.description);
String descriptionString = editText.getText().toString();
editText = (EditText)currentRow.findViewById(R.id.price);
String priceString = editText.getText().toString();
Log.d(TAG, "z! " + descriptionString + " @ " + priceString);
}
}
编辑:我不想更改这个答案,因为它已经被接受,所以我在另一个答案中提出了更简洁的解决方案。
关于android - 从 Android 中的多个布局获取 EditTexts 的值不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42142455/