Я новичок, так что извините, если это окажется так просто, что я должен был решить сам. Я пару дней думал об этом. Я исследовал тонну и искал много других сообщений здесь, но безуспешно.
У меня есть диалог с DatePicker, кнопками, полями EditText и Spinners. Я могу заполнить все, что мне нужно, от сохраненных элементов в моей БД до диалога. Но когда я пытаюсь ввести числа в некоторые поля EditText, он выдает NumberFormatException. Я могу жестко закодировать значения в переменные для хранения и скрыть свою попытку получить значение в попытке, и она будет работать нормально. Значения сохраняются, и когда я снова открываю диалоговое окно, они заполняют нужные области.
Вот частичный код-
EditText et = new EditText(getContext());
for(int i=0; i<=etcount; i++){
placed = -1; //reset for next iteration
//try to get number from edittext
et.findViewById(i);
placed = Integer.parseInt(et.getText().toString());
awake++;
/*
try {
//et.findViewById(i);
placed = Integer.parseInt(findViewById(i).toString());
//placed = Integer.parseInt(et.getText().toString());
} catch(NumberFormatException nfe) {
System.out.println("Could not parse " + nfe);
}*/
Я закомментировал блок try, потому что хотел быстро устранить неполадки.
Переменная etcount инициализируется при onCreate значением -1 до получения значений из БД. Если в БД хранятся значения, они увеличиваются на 1, тогда вызывается код для динамического добавления EditText и Spinner в макет. Также для идентификатора EditText установлено значение etcount. Вот этот код-
//this will be ran when +placement button pressed, or if there are items in db stored
//adds 2 rows to dialog, one for textview to label items, one row for edittext with number
//and spinner with what item it is
private void createTableRow(int numPlaced, int itmPlaced){
etcount++; //used to count how many edittext fields there are so that they can be saved later
spincount++; //to count how many spinner there are
tl = (TableLayout)findViewById(R.id.tableLayoutVisit); //the tablelayout name
//need to create row for textview, then another row for edittext and spinner
tr1 = new TableRow(this.getContext()); //table row 1, for textview
tr1.setLayoutParams(new LayoutParams(
LayoutParams.FILL_PARENT,
LayoutParams.WRAP_CONTENT));
TextView tv = new TextView(this.getContext());
tv.setText("Amount Placed");
tv.setLayoutParams(new LayoutParams(
LayoutParams.FILL_PARENT,
LayoutParams.WRAP_CONTENT));
tr1.addView(tv); //add textview to tablerow1
tl.addView(tr1, new TableLayout.LayoutParams( //add row to tablelayout
LayoutParams.FILL_PARENT,
LayoutParams.WRAP_CONTENT));
tr2 = new TableRow(this.getContext()); //tablerow2: edittext and spinner
tr2.setLayoutParams(new LayoutParams(
LayoutParams.FILL_PARENT,
LayoutParams.WRAP_CONTENT));
EditText et = new EditText(this.getContext());
et.setId(etcount);
et.setInputType(InputType.TYPE_CLASS_NUMBER);
if(numPlaced!=0){ //if being populated from previous visit
et.setText(Integer.toString(numPlaced));
//et.setText("" +numPlaced);
}
//need to have listener to read data
et.setLayoutParams(new LayoutParams(
LayoutParams.FILL_PARENT,
LayoutParams.WRAP_CONTENT));
Spinner spin = new Spinner(this.getContext());
spin.setId(spincount);
spinArray = getContext().getResources().getStringArray(R.array.itemplaced);
ArrayAdapter adapter = new ArrayAdapter(getContext(),
android.R.layout.simple_spinner_item, spinArray);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spin.setAdapter(adapter);
if(itmPlaced!=-1){
spin.setSelection(itmPlaced); //assign correct value
}
spin.setLayoutParams(new LayoutParams(
LayoutParams.FILL_PARENT,
LayoutParams.WRAP_CONTENT));
tr2.addView(et);
tr2.addView(spin);
tl.addView(tr2, new TableLayout.LayoutParams( //add row to tablelayout
LayoutParams.FILL_PARENT,
LayoutParams.WRAP_CONTENT));
}
Я передаю его (0,-1), если это новый элемент и в настоящее время не хранится в БД. Также вы, наверное, заметили, что я заставил его принять TYPE_CLASS_NUMBER. Но я не думаю, что проблема там. Опять же, если я жестко закодирую значения, они будут сохранены в БД, и в следующий раз, когда я открою его, он динамически создаст строку EditText/Spinner в макете и заполнит EditText значением в БД.
Итак... что-то не так с первым разделом, я думаю, et.findViewById(i); или размещено = Integer.parseInt(et.getText().toString());. Значение "etcount" должно быть -1, если ничего не заполняется из БД, и 0 и т.д.(etcount++) каждый раз, когда что-то заполняется из БД.
Извините, если это многословно, хотел быть конкретным. Надеюсь, этой информации достаточно! Любая помощь будет здорово!!! Заранее спасибо.