AutoCompleteTextView: удалить мягкую клавиатуру на задней панели вместо предложений

при использовании AutoCompleteTextView в выпадающем списке предложение с клавиатуры до сих пор видны. Это имеет смысл, так как часто гораздо эффективнее вводить последующие символы, чтобы сузить список.

но если пользователь хочет перемещаться по списку предложений, это становится чрезвычайно утомительным с клавиатурой программного обеспечения все еще (это еще большая проблема, когда устройство находится в альбомной ориентации). Навигация по списку намного проще без клавиатуры hogging место на экране. К сожалению, поведение по умолчанию сначала удаляет список при нажатии клавиши "назад" (хотя в версиях программного обеспечения клавиши "Назад" отображается изображение с надписью "нажатие этого скроет клавиатуру").

вот пример 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() в каждом действии и маршрутизации он, соответственно, определенно не будет идеальным), чтобы сделать первый задний пресс скрыть клавиатуру, а второй удалить список предложений?

2 ответов


вы можете достичь этого, переопределив-ing 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);
        }

    }

set DismissClickListener такой

 autoCompleteTextView.setOnDismissListener(new AutoCompleteTextView.OnDismissListener() {
            @Override
            public void onDismiss() {
                InputMethodManager in = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                in.hideSoftInputFromWindow(getCurrentFocus().getApplicationWindowToken(), 0);
            }
        });