我有EditText
附加了ListPopupWindow
,其中列出了最近的搜索查询。当用户点击EditText
时,弹出窗口应显示,然后当用户开始输入时,弹出窗口应该会消失。
这主要使用OnFocusChangeListener
,OnTextChangedListener
和OnEditorActionListener
。但是,如果用户点击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;
}
});
答案 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成员,但是,OnClickListener
或OnTouchListener
没有这样做,所以这些侦听器永远不会被设置为{{ 1}}对象。一旦我添加了将这些侦听器传递给EditText
对象的方法,我通过保留上面列出的代码并添加以下内容来修复我的问题:
EditText