如何从动态创建的EditTexts获取输入?

时间:2012-10-31 01:01:11

标签: java android arraylist android-edittext

我有一个Button,可以向EditText添加TableLayout行。我需要找到添加的每行EditText中的输入。

例如:有人添加了3行,这意味着有3 EditText。在每个EditText中,他们输入数字3.我需要存储添加到布局中的EditText的值,并通过单击按钮将它们全部添加。

我会使用列表然后迭代该列表吗?我不确定我会怎么做。

到目前为止,这是我的代码......

int count = 1;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);       
    setContentView(R.layout.activity_main);
    getSavedState();

    Button buttonAdd = (Button) findViewById(R.id.button1);
    Button buttonDel = (Button) findViewById(R.id.button2);
    Button buttonCalc = (Button) findViewById(R.id.button3);
    buttonAdd.setOnClickListener(this);
    buttonDel.setOnClickListener(this);
}

public void onClick(View v) {
    TableLayout tableLayout1 = (TableLayout) findViewById(R.id.tableLayout1);
    List<EditText> allEd = new ArrayList<EditText>();

    switch(v.getId()){
        case R.id.button1:
            if(count != 16){
                count++;

                // Create the row only when the add button is clicked
                TableRow tempRow = new TableRow(MainActivity.this);
                EditText tempText1 = new EditText(MainActivity.this);
                EditText tempText2 = new EditText(MainActivity.this);
                TextView tempTextView = new TextView(MainActivity.this);
                EditText editText1 = (EditText) findViewById(R.id.editText1);
                EditText editText2 = (EditText) findViewById(R.id.editText2);
                TextView textView3 = (TextView) findViewById(R.id.textView3);
                tempTextView.setText(count + ".");

                tempRow.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
                tempText1.setLayoutParams(editText1.getLayoutParams());
                tempText2.setLayoutParams(editText2.getLayoutParams());
                tempTextView.setLayoutParams(textView3.getLayoutParams());
                tempText1.setInputType(InputType.TYPE_CLASS_TEXT);
                tempText2.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL);
                tempText2.setId(count);
                allEd.add(tempText2);

                tempRow.addView(tempTextView);
                tempRow.addView(tempText1);
                tempRow.addView(tempText2);
                tableLayout1.addView(tempRow);
            } 
            else {
                final AlertDialog alertDialog = new AlertDialog.Builder(MainActivity.this).create(); //Read Update
                alertDialog.setTitle("Error");
                alertDialog.setMessage("You can only have 10 rows!");

                alertDialog.setButton("Ok", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        alertDialog.dismiss();
                    }
                });

                alertDialog.show();
            }
            break;
        case R.id.button2:
            if(count != 1){
                count--;
                tableLayout1.removeView(tableLayout1.getChildAt(count));
        } 
            else {
                final AlertDialog alertDialog = new AlertDialog.Builder(MainActivity.this).create(); //Read Update
                alertDialog.setTitle("Error");
                alertDialog.setMessage("You must have at least one row!");

                alertDialog.setButton("Ok", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        alertDialog.dismiss();
                    }
                });

                alertDialog.show();
            }
            break;
        case R.id.button3:
            String[] strings = new String[allEd.size()];
            for(int i = 0; i < allEd.size(); i++) {
                strings[i] = allEd.get(i).getText().toString();
                int input = Integer.parseInt(strings[i]);

                final AlertDialog alertDialog = new AlertDialog.Builder(MainActivity.this).create(); //Read Update
                alertDialog.setTitle("Your calculated GPA");
                alertDialog.setMessage("Your calculated GPA is: " + input/count);
                alertDialog.setButton("Ok", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        alertDialog.dismiss();
                    }
                });

                alertDialog.show();
            }
        break;

    }

2 个答案:

答案 0 :(得分:2)

您需要保留对按下每个按钮时添加的EditText的引用。由于您不知道将添加多少,我建议使用List<EditText>来存储它们。将其设为成员变量,然后您可以访问列表中EditText的输入。

答案 1 :(得分:1)

创建每个EditText时,需要将它们添加到类似数组的容器中,例如ArrayList<EditText>。只要您需要访问这些动态EditText中的任何一个,就可以从ArrayList中检索它们。

我可以看到您已经在ArrayList<EditText>方法中创建了onClick()。这很好,但您需要将ArrayList移到onClick()方法之外,以便您可以从您创建的任何其他方法中引用它。所以移动这条线......

List<EditText> allEd = new ArrayList<EditText>();

在方法之外,所以onClick()的开头几行现在看起来像这样......

List<EditText> allEd = new ArrayList<EditText>();

public void onClick(View v) {
    TableLayout tableLayout1 = (TableLayout) findViewById(R.id.tableLayout1);

    switch(v.getId()){
    case R.id.button1:

另外,请确保将所有EditText添加到ArrayList - 我看到有一行allEd.add(tempText2);但我看不到{{1}的任何行 - 如果您需要访问allEd.add(tempText1);,请确保将其添加到列表中。

要执行“添加”计算,您需要循环tempText1中的条目,获取它们的值,然后将它们一起添加。像这样......

ArrayList