如何在保持专注的同时使用EditText onClick方法

时间:2016-04-21 13:18:34

标签: android android-edittext

我有EditText附加了ListPopupWindow,其中列出了最近的搜索查询。当用户点击EditText时,弹出窗口应显示,然后当用户开始输入时,弹出窗口应该会消失。

这主要使用OnFocusChangeListenerOnTextChangedListenerOnEditorActionListener。但是,如果用户点击EditText,开始输入,然后再次点击EditText,我需要弹出窗口重新启动。我尝试使用OnClickListener代替OnFocusChangeListener,但永远无法使用OnClickListener显示弹出窗口。

如果用户点击了ListPopUpWindow,如果它已经有焦点,如何显示EditText

searchBox.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    public void onFocusChange(View v, boolean gainFocus) {
        //onFocus
        if (gainFocus) {
            popUpWindow.show();
        }
    }
});

一旦用户开始在EditText字段中输入

,就会关闭弹出窗口
searchBox.addTextChangedListener(new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {

    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {

    }

    @Override
    public void afterTextChanged(Editable s) {
        popUpWindow.dismiss();
    }
});

清除焦点,关闭弹出窗口并执行搜索

searchBox.setOnEditorActionListener(new TextView.OnEditorActionListener() {
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        if ((actionId & v.getImeOptions()) == actionId) {
            if (event != null && event.getAction() == KeyEvent.ACTION_DOWN) {
                if (searchBox.getText().toString().length() == 0) return true;
                searchBox.clearFocus();
                popUpWindow.dismiss();
                fetchResults();
                Util.hideKeyboard(v);
                return true;
            }
        }
        return false;
    }
});

2 个答案:

答案 0 :(得分:1)

您可以尝试使用触摸侦听器替换焦点更改侦听器,并在MOTION_UP事件发生时显示弹出窗口:

    editText.setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if ((event.getAction() == MotionEvent.ACTION_UP) {
                // Show popup here
            }
            return false;
        }
    });

答案 1 :(得分:0)

我发现了问题。事实证明,我实际上并没有使用EditText对象,而是一个名为MaterialEditText的自定义类,它为EditText对象提供了一个包装器,为其提供了Material UI功能。该类将我一直使用的侦听器传递给它的EditText成员,但是,OnClickListenerOnTouchListener没有这样做,所以这些侦听器永远不会被设置为{{ 1}}对象。一旦我添加了将这些侦听器传递给EditText对象的方法,我通过保留上面列出的代码并添加以下内容来修复我的问题:

EditText