2014-08-27 2 views
0

У меня есть класс, в котором пользователь может динамически генерировать представления EditText. Я пытаюсь проверить их, чтобы проверить, пусты ли они, когда пользователь переходит к следующей странице. Если они есть, то триггеры проверки приостанавливают процесс перехода на другую страницу, пока пользователь не заполнит поля EditText, которые он создал.Проверка динамически сгенерированных EditTexts

Вот что у меня есть:

поколение EditText

int EditTextID = 5000; 
insertPoint = findViewById(R.id.questionsContainer); 

if(v.getId() == R.id.makeLayoutButton){ 

    //get form template which has an EditText of id "questionAnswerEt" 
    v1 = vi.inflate(R.layout.form_template, null); 

    //add it into my view 
    ((LinearLayout) insertPoint).addView(v1); 

    v1.setId(formParentID); 

    //get edittext 
    questionAnswer = (EditText)v1.findViewById(R.id.questionAnswerET); 

    //set id 
    questionAnswer.setId(EditTextID); 

    EditTextID++; 
} 

Validation

if(v.getId() == R.id.bNext){ 
    for(int x = 5000; x <= 5007; x++){ 
     questionAnswer = (EditText)findViewById(x); 
     String questionAnswerValidator = (String) questionAnswer.getText().toString(); 

     if(questionAnswerValidator.length() == 0){ 
      ((EditText) questionAnswer.findViewById(x)) 
      .setError("Question Title is Required!"); 
     } 
    } 
} 

Цикл начинается в 5000, потому что генерируемые EditTexts имеют установленные вручную идентификаторы, которые начинаются от 5000 и затем увеличивать каждый раз, когда пользователь решает другой EditText. Затем я получаю EditText, перебирая идентификаторы, ссылаясь на «questionAnswer». Затем я помещаю строковое значение questionAnswer (id of x) в строку «questionAnswerValidator». Затем проверяется, будет ли его пустым, и если он будет вызывать сообщение setError на соответствующих EditTexts, которые пусты. Проблема в том, что приложение сбой, когда начинается проверка, дает мне исключение с нулевым указателем. Любая подсказка относительно того, где я иду не так? Спасибо.

Вход:

08-27 14:27:02.084: W/dalvikvm(16285): threadid=1: thread exiting with uncaught exception (group=0x4166fe18) 
08-27 14:27:02.084: E/AndroidRuntime(16285): FATAL EXCEPTION: main 
08-27 14:27:02.084: E/AndroidRuntime(16285): Process: com.example.testing, PID: 16285 
08-27 14:27:02.084: E/AndroidRuntime(16285): java.lang.NullPointerException 
08-27 14:27:02.084: E/AndroidRuntime(16285): at com.example.testing.MakeQuestion.onClick(MakeQuestion.java:212) 
08-27 14:27:02.084: E/AndroidRuntime(16285): at android.view.View.performClick(View.java:4480) 
08-27 14:27:02.084: E/AndroidRuntime(16285): at android.view.View$PerformClick.run(View.java:18686) 
08-27 14:27:02.084: E/AndroidRuntime(16285): at android.os.Handler.handleCallback(Handler.java:733) 
08-27 14:27:02.084: E/AndroidRuntime(16285): at android.os.Handler.dispatchMessage(Handler.java:95) 
08-27 14:27:02.084: E/AndroidRuntime(16285): at android.os.Looper.loop(Looper.java:157) 
08-27 14:27:02.084: E/AndroidRuntime(16285): at android.app.ActivityThread.main(ActivityThread.java:5872) 
08-27 14:27:02.084: E/AndroidRuntime(16285): at java.lang.reflect.Method.invokeNative(Native Method) 
08-27 14:27:02.084: E/AndroidRuntime(16285): at java.lang.reflect.Method.invoke(Method.java:515) 
08-27 14:27:02.084: E/AndroidRuntime(16285): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) 
08-27 14:27:02.084: E/AndroidRuntime(16285): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:674) 
08-27 14:27:02.084: E/AndroidRuntime(16285): at dalvik.system.NativeStart.main(Native Method) 
+0

@andruboy сделано. – Frisbetarian

+0

также поместил код нажатия кнопки Я думаю, что вы не регистрируете кнопку onClickListener (это); – MilapTank

+0

@andruboy Записывается нажатие кнопки. У меня есть проверка на статические поля EditText и его работоспособность, когда пользователь нажимает «bNext». Это когда я добавил подтверждение для динамических EditTexts, которые он начал сбой. – Frisbetarian

ответ

0

попробовать этот код для проверки TextUtil.isEmpty(questionAnswerValidator) будет проверить нуль и 0 длиной

String questionAnswerValidator; 
if(v.getId() == R.id.bNext){ 
for(int x = 5000; x <= 5007; x++){ 
    questionAnswer = (EditText)findViewById(x); 
    questionAnswerValidator = questionAnswer.getText().toString(); 

    if(TextUtil.isEmpty(questionAnswerValidator)){ 
     questionAnswer.setError("Question Title is Required!"); 
    } 
    } 
} 
0

Кажется, что я выходил за пределы в петле. Это сделал трюк:

for(int x = 5000; x < EditTextID; x++){ 
    questionAnswer = (EditText)findViewById(x); 
    if(questionAnswer.getText().toString().length() == 0){ 
     questionAnswer.setError("Question Title is Required!"); 
    } 
} 

Единственная проблема заключается в том, что его теперь показывает значок setError на соответствующие поля пустые EditTexts но непредоставление сообщение об ошибке, пока я не начать печатать в соответствующем EditText. Weird.

0

Как сказал вам Фрисбетариан, вы можете использовать его ответ и добавить .requestFocus, чтобы ошибка появилась в EditText. Обратите внимание, что EditText, который показывает последнюю ошибку, получит фокус ошибки, пока вы не заполните этот EditText в частности.

for(int x = 5000; x < EditTextID; x++){ 
    questionAnswer = (EditText)findViewById(x); 
    if(questionAnswer.getText().toString().length() == 0){ 
     questionAnswer.setError("Question Title is Required!"); 
     questionAnswer.requestFocus(); 

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