AutoCompleteTextView: удалите мягкую клавиатуру на заднем прессе, а не предложения
При использовании AutoCompleteTextView
список подсказок с раскрывающимся списком появляется, когда программная клавиатура все еще видна. Это имеет смысл, так как часто гораздо более эффективно печатать последующие символы, чтобы сузить список.
Но если пользователь хочет перейти по списку предложений, он становится крайне утомительным, когда клавиатура программного обеспечения все еще работает (это даже большая проблема, когда устройство находится в альбомной ориентации). Навигация по списку намного проще, если клавиатура не забивает экран. К сожалению, поведение по умолчанию сначала удаляет список, когда вы нажимаете клавишу "Назад" (хотя в версиях программного обеспечения задней клавиши отображается изображение, в котором говорится, что "нажатие на это скроет клавиатуру" ).
Вот пример barebones, который демонстрирует, о чем я говорю:
public class Main2 extends Activity {
private static final String[] items = {
"One",
"Two",
"Three",
"Four",
"Five"
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
AutoCompleteTextView actv = new AutoCompleteTextView(this);
actv.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
actv.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, items));
actv.setThreshold(1);
LinearLayout ll = new LinearLayout(this);
ll.setOrientation(LinearLayout.VERTICAL);
ll.addView(actv);
setContentView(ll);
}
}
Помимо того, что это неинтуитивно (подсказка на задней клавише подсказывает, что обратное нажатие будет отправлено на клавиатуру), это делает навигацию по предложениям AutoCompleteTextView
крайне утомительной.
Что такое наименьший назойливый способ (например, перехват назад на onBackPressed()
в каждом действии и его маршрутизация, безусловно, не идеальны), чтобы сделать первый обратный вызов скрыть клавиатуру и второй удалить список предложений?
Ответы
Ответ 1
Вы можете добиться этого, переопределив onKeyPreIme в своем пользовательском AutoCompleteTextView.
public class CustomAutoCompleteTextView extends AutoCompleteTextView {
public CustomAutoCompleteTextView(Context context) {
super(context);
}
public CustomAutoCompleteTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CustomAutoCompleteTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
public boolean onKeyPreIme(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && isPopupShowing()) {
InputMethodManager inputManager = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
if(inputManager.hideSoftInputFromWindow(findFocus().getWindowToken(),
InputMethodManager.HIDE_NOT_ALWAYS)){
return true;
}
}
return super.onKeyPreIme(keyCode, event);
}
}
Ответ 2
установите DismissClickListener
следующим образом
autoCompleteTextView.setOnDismissListener(new AutoCompleteTextView.OnDismissListener() {
@Override
public void onDismiss() {
InputMethodManager in = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
in.hideSoftInputFromWindow(getCurrentFocus().getApplicationWindowToken(), 0);
}
});