2012-10-31 39 views
0

我有一个Button,它增加了一行EditTextTableLayout。我需要找出每个添加行的EditText中的输入。如何从动态创建的EditTexts获取输入?

例如:有人增加了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; 

    } 

回答

1

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

我可以看到,您已经在onClick()方法中创建了ArrayList<EditText>。这很好,但您需要将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 s到ArrayList - 我看到有一行allEd.add(tempText2);,但我看不到allEd.add(tempText1);的任何行 - 如果您需要访问tempText1,请确保将其添加到列表中。

要执行“添加”计算,您需要遍历ArrayList中的条目,获取它们的值,然后将它们相加。像这样...

case R.id.button3: 
    // calculate the value first 
    int calculation = 0; 
    for (int i=0;i<allEd.size();i++){ 
     // get the entry 
     EditText textField = addEd.get(i); 

     try { 
      // get the value, as a number 
      int numberValue = Integer.parseInt(textField.getText()); 
      // add it to the calculation 
      calculation += numberValue; 
     } 
     catch (Exception e){ 
      // ignore errors if the input is empty or isn't a number 
     } 
    } 

    // now display the result 
    final AlertDialog alertDialog = new AlertDialog.Builder(MainActivity.this).create(); 
    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; 
+0

我为onClick方法添加了一个“计算”按钮,并通过将onList移出ArrayList,计算按钮正确显示了每个单独的输入。那么我将如何去添加每个输入? – user1460211

+0

您的意思是,将这些值加在一起?你需要遍历'ArrayList'的所有内容,获取值并将它们加在一起。 – wattostudios

+0

是的。我添加了我的button3 onClick到我发布的问题。我想获取每个引用的值,添加它,然后将其吐出给用户。 – user1460211

2

你需要保持到添加与每个按钮按下EditText S变量。既然你不知道会添加多少,我建议使用List<EditText>来存储它们。使其成为成员变量,然后您可以访问列表中的EditText的输入。

+0

正是我想要回答的。这是访问dinamycally添加元素的一个非常简单的方法。 –

相关问题