一段时间没有问过问题,所以它早就应该了!
我正在创建一个应用程序,其中可以在onClick上创建作业项,每个新行包含一个Description(EditText),一个Price(EditText)和一个删除当前行的按钮,但是我在获取值时遇到问题当有多行时,从EditText字段 - 它只返回最新行的值。
除了“作业列表容器”之外,视图是动态创建的,所以原谅缺少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
答案 0 :(得分:2)
基本问题是您只使用description
和price
的最后一个实例而不是每个行实例。 (这可能是德米特里所说的)。要修复它,您需要获取每行的输入。这是一种方式。
设置description
&amp;的ID price
。 (你不能只使用'1'或'2',它需要是一个资源类型ID,所以它保证是唯一的)。我做了一个行&amp;的虚拟布局文件。已为此EditText
分配了ID。可能有更好的方法来做到这一点。所以无论如何,在声明中添加这两行
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);
}
}
编辑:我不想改变这个答案,因为它已被接受,所以我在另一个答案中提出了一个更简洁的解决方案。
答案 1 :(得分:1)
原因是,您的上一个setOnClickListener需要字符串
String descriptionString = description.getText()。toString();
String priceString = price.getText()。toString();
描述和价格 - 函数中的字段(last edittexts)。 这样做的好方法是使用RecyclerView / ListView,在ViewHolder的“onTextChangeListner”中将新文本保存到此对象的模型中并打印模型中的所有文本,而不是直接从视图中打印。
答案 2 :(得分:0)
我通常只尝试回答被问到的问题,而不是更改不必要的代码。但是,在这种情况下,由于我创建了一个虚拟布局只是为了获取资源ID,我想知道是否可以使用该布局文件。我已经开始改变我的答案,但在我做出改变之前,原始的答案被接受了。我在这里提出了不同版本的解决方案。我不想修改已被接受的答案。
private void addJobItem() {
//Create a new row container
LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
LinearLayout jobRowContainer = (LinearLayout)inflater.inflate(R.layout.row_layout, null);
//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++) {
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);
}
}
});
}
row_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/single_row">
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="Description..."
android:id="@+id/description"
/>
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="00.00"
android:id="@+id/price"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:color/holo_red_dark"
android:text="X"
android:id="@+id/clear_button"
/>
</LinearLayout>