2015-07-19 4 views
1

Я пытаюсь настроить систему для проверки ввода пользователя, в этом случае просто проверяя, что пользователь вводит что-либо.Сохранение фокуса на Edittext внутри OnFocusChanged Listener

У меня есть Utility class, который проверяет, что у данных EditText есть данные.

Я использую OnFocusChangeListener, который затем вызывает метод из Utility class.

Это код из activity:

editText = (EditText) view.findViewById(R.id.editText); 
    editText.setOnFocusChangeListener(new View.OnFocusChangeListener() { 
     @Override public void onFocusChange(View v, boolean hasFocus) { 

      if (!hasFocus) { 
       if (Utility.checkInput(editText) == false) { 
        Toast.makeText(getActivity(), "Enter value!", 
          Toast.LENGTH_SHORT).show(); 
        // TODO.... 
        // Retain focus - do not allow user to move on. 
        // This is where I am lost... 

       } 
      } 
     } 
    }); 

Это код из Utility class:

public class Utility { 
    public static boolean checkInput(EditText editText) { 
     if (editText.getText().length() != 0) { 
      return true; 
     } 
     return false; 
    } 
    //.../ 
  1. Где я озадачен, как сохранить фокус, если входной контроль возвращает false. Я хочу, чтобы пользователь не двигался вперед. Я уверен, что есть простое решение, но я его не нашел.

  2. Мне также интересно, повлияет ли это на xmlime.Options.
    Спасибо.

EDIT

Это мой XML:

<EditText 
    android:imeOptions="actionDone" 
    android:inputType="textPersonName" 
    android:maxLength="24"/> 

<spinner ../ 

<EditText 
    android:imeOptions="actionDone" 
    android:inputType="phone" 
    android:maxLength="12"/> 

Когда я использую:

if (!hasFocus) { 
    if (Utility.checkInput(name) == false) { 
     Toast.makeText(AddDriverUserActivity.this, "Enter value!",Toast.LENGTH_SHORT).show(); 
     name.requestFocus(); 
     } 
} 

Проблема заключается в том, я использую действие сделано (чтобы скрыть клавиатура), поскольку пользователь затем выбирает из счетчика, затем переходит к следующему EditText. Так тост не показывать, пока я не коснуться следующего редактирования текста (телефона) и фокус затем устанавливается на два редактирования текстов:

enter image description here

Когда сброс:

android:imeOptions="actionDone" в actionNext это показывает тост, а затем переходит к следующему редактору, как показано на снимке экрана, оба фокусируются.

Request focus не мешает ему перейти от edittext.

+0

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

ответ

1

Использование View.requestFocus()

// Retain focus - do not allow user to move on. 
editText.requestFocus(); 
+0

спасибо Пейли, я пойду протестирую его, я был не уверен о requestfocus –

+0

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

0

Это не решение сохранить focus в EditText для проверки вводимых данных, но это элегантный способ проверить на ввод данных пользователем.

Я добавляю все свои EditText s в array и передаю их методу, который проходит через массив и проверяет каждый для ввода.

В моих Utility class:

public static boolean checkAllInput(EditText[] editTexts) { 
    for (int i = 0; i < editTexts.length; i++) { 
     if (editTexts[i].getText().length() == 0) { 
      return false; 
     } 
    } 
    return true; 
} 

В деятельности/фрагменте:

добавляет EditTexts в массив:

final EditText[] editTexts = {arg1, arg2, arg3, arg4, .../}; 

Затем используйте функцию в моей OnTouchListener для button ,

addBtn.setOnTouchListener(new View.OnTouchListener() { 
     @Override public boolean onTouch(View v, MotionEvent event) { 
      hideKeyboard(); 
      disableButton(addBtn); 
      if (Utility.checkAllInput(editTexts) == false) { 
       Toast.makeText(getActivity(), "Enter all fields", 
         Toast.LENGTH_SHORT).show(); 
       enableButton(addBtn); 
      } else { 
       // Do something .. 
      } 
      return false; 
     } 
    }); 

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

В качестве примечания, я отключить мои кнопки, чтобы предотвратить повторные штрихи:
Using countdown to set button enabled