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);
            }
        });