Подтвердить что ты не робот

EditText не теряет фокус

editText не теряет фокус в моем приложении, когда я выхожу из него, он имеет оранжевую рамку все время и этот черновой курсор. Я сделал это LinearLayout в соответствии с этим, окружающим editText: Остановить EditText от получения фокуса при запуске Activity поэтому он не фокусируется на запуске приложения.

это мой код:

final EditText et = (EditText)findViewById(R.id.EditText01);

final InputMethodManager imm = (InputMethodManager) getSystemService(
   INPUT_METHOD_SERVICE);

et.setOnClickListener(new View.OnClickListener() {
   public void onClick(View v) {
      imm.showSoftInput(et, InputMethodManager.SHOW_IMPLICIT);
   }
});

et.setOnFocusChangeListener(new View.OnFocusChangeListener() {
   public void onFocusChange(View v, boolean hasfocus) {
      if(hasfocus) {
         imm.showSoftInput(et, InputMethodManager.SHOW_IMPLICIT);
      } else {
         imm.hideSoftInputFromWindow(et.getWindowToken(), 0);
      }
   }
});

Но, похоже, он не вызывает onFocusChange, когда я нажимаю где-нибудь вне editText!

4b9b3361

Ответ 1

Это просто. Вы можете поместить следующее в LinearLayout или любое другое:

android:focusableInTouchMode="true"

Ответ 2

Переопределить Activity.dispatchTouchEvent():

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    if (ev.getAction() == MotionEvent.ACTION_DOWN) {
        View view = getCurrentFocus();
        if (view != null && view instanceof EditText) {
            Rect r = new Rect();
            view.getGlobalVisibleRect(r);
            int rawX = (int)ev.getRawX();
            int rawY = (int)ev.getRawY();
            if (!r.contains(rawX, rawY)) {
                view.clearFocus();
            }
        }
    }
    return super.dispatchTouchEvent(ev);
}

Таким образом, всякий раз, когда кто-то щелкнет где-нибудь, у вас есть контроль, и он только в одной точке кода.

Ответ 3

Создайте прослушиватель onClick, возможно, в вашем XML-макете, чтобы прослушивать клики в фоновом режиме LinearLayout. Отсюда вы можете вызвать .clearFocus() на EditText после того, как вы сделаете его переменной экземпляра активности, в которой вы работаете.

Ответ 4

Вы можете удалить фокус из EditText, установив фокус на другое поле, вызвав метод.

Предположим, что я установил фокус на кнопку "Назад", нажав кнопку "Готово", затем вызовите метод на кнопке "Назад" внутри кнопки "Запустить кнопку".

И ваша проблема решена.

back.requestFocusFromTouch();