Android 如何在保持焦点的同时使用EditText onClick方法

Android 如何在保持焦点的同时使用EditText onClick方法,android,android-edittext,Android,Android Edittext,我有一个EditText,它附带了一个ListPopupWindow,其中列出了最近的搜索查询。当用户单击编辑文本时,弹出窗口应显示,然后当用户开始键入时,弹出窗口应消失 这主要是使用OnFocusChangeListener、OnTextChangedListener和OnEditorActionListener实现的。但是,如果用户单击了EditText,开始键入,然后再次单击EditText,我需要弹出窗口返回。我曾尝试使用OnClickListener而不是onfocuschangese

我有一个
EditText
,它附带了一个
ListPopupWindow
,其中列出了最近的搜索查询。当用户单击编辑文本时,弹出窗口应显示,然后当用户开始键入时,弹出窗口应消失

这主要是使用
OnFocusChangeListener
OnTextChangedListener
OnEditorActionListener
实现的。但是,如果用户单击了
EditText
,开始键入,然后再次单击
EditText
,我需要弹出窗口返回。我曾尝试使用
OnClickListener
而不是
onfocuschangesetener
,但无法使用
OnClickListener
显示弹出窗口

如果用户点击了
EditText
,我如何才能让
ListPopUpWindow
显示它是否已经有焦点?

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

您可以尝试用触控式监听器替换焦距更改监听器,并在发生运动事件时显示弹出窗口:

    editText.setOnTouchListener(new OnTouchListener() {

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

我发现了问题。事实证明,我实际上并没有使用
EditText
对象,而是使用了一个名为
MaterialEditText
的自定义类,该类为
EditText
对象提供了一个包装器,为其提供了材质UI特性。该类将我一直使用的侦听器传递给它的EditText成员,但是,它没有为
OnClickListener
OnTouchListener
这样做,因此这些侦听器从未为
EditText
对象设置。一旦我添加了将这些侦听器传递到
EditText
对象的方法,我就通过保留上面列出的代码并添加以下内容解决了问题:

searchBox.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // Show Popup
    }
});

这对我不起作用。我还确保将FocusableInTouchMode设置为true。