Ответ 1
Это просто. Вы можете поместить следующее в LinearLayout или любое другое:
android:focusableInTouchMode="true"
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!
Это просто. Вы можете поместить следующее в LinearLayout или любое другое:
android:focusableInTouchMode="true"
Переопределить 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);
}
Таким образом, всякий раз, когда кто-то щелкнет где-нибудь, у вас есть контроль, и он только в одной точке кода.
Создайте прослушиватель onClick
, возможно, в вашем XML-макете, чтобы прослушивать клики в фоновом режиме LinearLayout. Отсюда вы можете вызвать .clearFocus()
на EditText
после того, как вы сделаете его переменной экземпляра активности, в которой вы работаете.
Вы можете удалить фокус из EditText, установив фокус на другое поле, вызвав метод.
Предположим, что я установил фокус на кнопку "Назад", нажав кнопку "Готово", затем вызовите метод на кнопке "Назад" внутри кнопки "Запустить кнопку".
И ваша проблема решена.
back.requestFocusFromTouch();