получение целочисленного значения, введенного из динамически созданного текста редактирования в диалоговом окне в Android, генерирует NumberFormatException - PullRequest
2 голосов
/ 23 декабря 2011

Я новичок, очень жаль, если это окажется настолько простым, что я должен был решить сам. Я провел пару дней, думая об этом. Я исследовал тонну и искал много других сообщений здесь, но безуспешно.

У меня есть диалог с полями DatePicker, Buttons, 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);
        }*/

Я прокомментировал блок попытки, потому что хотел быстро устранить неполадки.

Переменная 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 ++) каждый раз, когда что-то заполняется из БД.

Извините, если это длинновато, хотел быть конкретным. Надеюсь, этого достаточно! Любая помощь будет отличной !!! Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 23 декабря 2011

Попробуйте:

    EditText et = new EditText(this);

    for (int i = 0; i <= etcount; i++) {
        placed = -1;
        et = (EditText) this.findViewById(i);
        placed = Integer.parseInt(et.getText().toString());
        //...
    }

Мне кажется, я обнаружил ошибку.Основная проблема в вашем коде в том, что вы не назначаете уникальные значения в методах setId.В вашем случае некоторые editTexts и spins могут иметь одинаковые идентификаторы.Это не верно.Каждый элемент должен иметь уникальный идентификатор.Это первое, что вы должны исправить в своем коде.

После этого вы можете использовать мой подход.Но мне кажется, что что-то не так в этом подходе.Это не красиво) Попробуйте найти лучшие практики в этой области.

0 голосов
/ 23 декабря 2011

Несколько предложений с моей стороны: 1) попробуйте проверить, не дает ли метод getText пустую строку "" или ноль.2) разместите свой EditText et;переменная класса не локальный экземпляр.Пример открытого классапоявляется в вашем цикле for для (int i = 0; i <= etcount; i ++) {place = -1;// сброс для следующей итерации </p>

    //try to get number from edittext  // which edit text you are trying to access. am sure it is  returning null to you.
    et.findViewById(i);
    placed = Integer.parseInt(et.getText().toString());
...