23

使用 时AutoCompleteTextView,会出现下拉建议列表,并且软件键盘仍然可见。这是有道理的,因为键入随后的字符来缩小列表的效率通常要高得多。

但是如果用户想要浏览建议列表,在软件键盘仍然打开的情况下会变得非常乏味(当设备处于横向时,这将是一个更大的问题)。在没有键盘占用屏幕空间的情况下浏览列表要容易得多。不幸的是,默认行为会在您按下后退键时首先删除列表(即使在后退键的软件版本中,它会显示“按下此键将隐藏键盘”的图像)。

这是一个准系统示例,演示了我在说什么:

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()在每个活动中重新启动并相应地路由它肯定不是理想的)?

4

2 回答 2

37

您可以通过在自定义AutoCompleteTextView中覆盖onKeyPreIme来实现。

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

}
于 2014-11-23T09:55:34.817 回答
3

DismissClickListener像这样设置

 autoCompleteTextView.setOnDismissListener(new AutoCompleteTextView.OnDismissListener() {
            @Override
            public void onDismiss() {
                InputMethodManager in = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                in.hideSoftInputFromWindow(getCurrentFocus().getApplicationWindowToken(), 0);
            }
        });
于 2015-10-23T06:48:03.207 回答