Reputation: 39
I have a Button
that adds a row with an EditText
to a TableLayout
. I need to find out the input in each EditText
of the rows that are added.
For example: Someone adds 3 rows, meaning there are 3 EditText
. In each EditText
, they put the number 3. I need to store the values of the EditText
that were added to the layout and add them all up by the click of a button.
Would I use a list then iterate that list? I'm not sure about how I would do this.
This is my code so far...
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;
}
Upvotes: 1
Views: 1651
Reputation: 8774
When you create each of the EditText
s, you need to to add them to an array-like container, such as an ArrayList<EditText>
. Whenever you need to access any of these dynamic EditText
s, you can retrieve them from the ArrayList
.
I can see that you are already creating an ArrayList<EditText>
in your onClick()
method. That's great, but you need to move the ArrayList
outside the onClick()
method so that you can reference it from any other methods you create. So move this line...
List<EditText> allEd = new ArrayList<EditText>();
outside the method, so that the beginning few lines of onClick()
now look like this...
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:
Also, make sure you're adding all the EditText
s to the ArrayList
- I see there is a line allEd.add(tempText2);
but I can't see any line for allEd.add(tempText1);
- if you need to access tempText1
, make sure you add it to the list.
To perform the 'adding' caluclation, you need to loop over the entries in the ArrayList
, get their values, then add them together. Something like this...
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;
Upvotes: 1
Reputation: 83537
You need to keep references to the EditText
s that are added with each button press. Since you don't know how many will be added, I suggest using a List<EditText>
to store them. Make this a member variable and then you can access the input from the EditText
s in the list.
Upvotes: 2