2013-12-16 7 views
1

У меня есть приложение, в котором я программно создаю LinearLayouts. LinearLayouts отличаются немного, но все они содержат несколько видов. Некоторые из них имеют поле EditText с TextWatcher. Когда эти представления создаются, я хочу использовать старое, сохраненное значение из настроек в поле EditText.setText после TextWatcher для программно созданного EditText

Когда я использую .setText (old_value) перед TextWtacher, данные в поле EditText верны, но календарное закрытие функции TextWatcher никогда не вызывается. Когда я пытаюсь использовать .setText (old_value) после TextWtacher, я получаю исключение NullPointerException.

Ниже короткий пример кода ...

(LinearLayout) linearLayout = new LinearLayout(); 
linearLayout.setId(ll_counter++); 
while (have more rows to process) { 
    BUTTON-VIEW-code; 
    linearLayout.addView(); 
    TEXT-VIEW-code 
    linearLayout.addView(TEXT-VIEW); 

    editText = new EditText(this); 
    editText.setId(et_counter++); 
    editText.setTag("SomeTag"); 
    editText.setText(old_value); // Works, but no calculations 
    editText.addTextChangedListener(new TextWatcher() { 
     public void afterTextChanged(Editable s) { 
      // do calculations and update add_text-field. 
     } 
     public void beforeTextChanged(Editable s) { 
      // nothing here 
     } 
     public void onTextChanged(Editable s) { 
      // nothing here 
     } 

    }); 
    editText.setText(old_value); // Doesn't Works, NULL PONTER EXCEPTION 
    linearLayout.addView(editText); 
} 

Если editText.setText придет после linearLayout.addView (EditText); как это? (С некоторым modifcations конечно ...)

linearLayout.addView(editText); 
editText.setText(old_value); 
+1

Не уверен, что создание «TextWatcher» внутри цикла while - лучшая ставка. Помните, что наблюдатель текста всегда будет для вас, если вы не избавитесь от него самостоятельно. У вас могут быть проблемы, потому что вы продолжаете создавать новые TextWatchers, когда действительно хотите только одного. –

+0

editText.setId (et_counter ++); && linearLayout.setId (ll_counter ++); выглядят немного рискованно, в зависимости от значений по умолчанию et_counter и ll_counter. Также, как упоминалось в @ pasta12, добавление TextWatcher внутри цикла не имеет большого смысла. Основываясь на вашей логике, кажется, вам нужен только один TextWatcher, где при создании мультипликаторов. –

+0

Pasta12, я посмотрю на это. Потому что, как вы говорите, мне нужен только один TextWtacher. И @Gaurav Arora, у меня есть более надежные идентификаторы, чем созданные в этом примере ... Но thanx как для ответа – user1086500

ответ

0

создать edittext вне времени цикла

editText = new EditText(this); 

while (have more rows to process) { 
    BUTTON-VIEW-code; 
    linearLayout.addView(); 
    TEXT-VIEW-code 
    linearLayout.addView(TEXT-VIEW); 
+0

Не вариант, поскольку цикл потенциально создает несколько полей edittext, которым нужен TextWatcher. Каждый linearLayout может иметь editText ... – user1086500

+0

Я мог бы, конечно, сохранить editText-идентификаторы в массиве и применить их после цикла while ... – user1086500

0

РЕШИТЬ: Полностью перестроенный код и нашел некоторые ошибки, где Была ссылка внутри TextWatcher на textField, который еще не был инициирован. Хотя я так и думал, так как

TextView textfield = new TextView(this); 

было сделано до EditText поля и текстовое поле было добавлено в LinearLayout до EditText поля, как это:

linearLayout.addView(textfield); 

Скорее всего ошибка новичка ...

Смежные вопросы