从Android中的多个布局获取EditTexts的值不起作用?

时间:2017-02-09 16:53:17

标签: android android-edittext

一段时间没有问过问题,所以它早就应该了!

我正在创建一个应用程序,其中可以在onClick上创建作业项,每个新行包含一个Description(EditText),一个Price(EditText)和一个删除当前行的按钮,但是我在获取值时遇到问题当有多行时,从EditText字段 - 它只返回最新行的值。

除了“作业列表容器”之外,视图是动态创建的,所以原谅缺少XML,但我想要实现的结构如下,单击“添加”按钮会添加一个行(这可以是多行)并单击提交按钮获取所有描述和价格值并处理它们(添加价格并将作业添加到数据库):

enter image description here

...这是我为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

3 个答案:

答案 0 :(得分:2)

基本问题是您只使用descriptionprice的最后一个实例而不是每个行实例。 (这可能是德米特里所说的)。要修复它,您需要获取每行的输入。这是一种方式。

设置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>