当只有一个 InstantAutoComplete 对象时,Destil的代码效果很好 . It didn't work with two though - 不知道为什么 . 但是当我将 showDropDown() (就像CommonsWare建议的那样)放入 onFocusChanged() 时,就像这样:
@Override
protected void onFocusChanged(boolean focused, int direction,
Rect previouslyFocusedRect) {
super.onFocusChanged(focused, direction, previouslyFocusedRect);
if (focused) {
performFiltering(getText(), 0);
showDropDown();
}
}
它解决了这个问题 .
只是两个答案恰当地结合在一起,但我希望它可以节省一些时间 .
3
这是我的 class InstantAutoComplete . 它是 AutoCompleteTextView 和 Spinner 之间的东西 .
import android.content.Context;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.widget.AutoCompleteTextView;
public class InstantAutoComplete extends AutoCompleteTextView {
public InstantAutoComplete(Context context) {
super(context);
}
public InstantAutoComplete(Context arg0, AttributeSet arg1) {
super(arg0, arg1);
}
public InstantAutoComplete(Context arg0, AttributeSet arg1, int arg2) {
super(arg0, arg1, arg2);
}
@Override
public boolean enoughToFilter() {
return true;
}
@Override
protected void onFocusChanged(boolean focused, int direction,
Rect previouslyFocusedRect) {
super.onFocusChanged(focused, direction, previouslyFocusedRect);
if (focused && getAdapter() != null) {
performFiltering(getText(), 0);
}
}
}
像这样在你的xml中使用它:
<your.namespace.InstantAutoComplete ... />
15
这对我有用,伪代码:
public class CustomAutoCompleteTextView extends AutoCompleteTextView {
public CustomAutoCompleteTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean enoughToFilter() {
return true;
}
@Override
protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {
super.onFocusChanged(focused, direction, previouslyFocusedRect);
if (focused) {
performFiltering(getText(), 0);
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
this.showDropDown();
return super.onTouchEvent(event);
}
}
searchAutoComplete.setThreshold(0);
searchAutoComplete.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {//cut last probel
if (charSequence.length() > 1) {
if (charSequence.charAt(charSequence.length() - 1) == ' ') {
searchAutoComplete.setText(charSequence.subSequence(0, charSequence.length() - 1));
searchAutoComplete.setSelection(charSequence.length() - 1);
}
}
}
@Override
public void afterTextChanged(Editable editable) {
}
});
//when clicked in autocomplete text view
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.header_search_etv:
if (searchAutoComplete.getText().toString().length() == 0) {
searchAutoComplete.setText(" ");
}
break;
}
}):
import android.content.Context
import android.util.AttributeSet
import android.widget.AutoCompleteTextView
class InstantAutoCompleteTextView : AutoCompleteTextView {
constructor(context: Context) : super(context)
constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs)
constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr)
override fun enoughToFilter(): Boolean {
return true
}
fun showDropdownNow() {
if (adapter != null) {
// Remember a current text
val savedText = text
// Set empty text and perform filtering. As the result we restore all items inside of
// a filter's internal item collection.
setText(null, true)
// Set back the saved text and DO NOT perform filtering. As the result of these steps
// we have a text shown in UI, and what is more important we have items not filtered
setText(savedText, false)
// Move cursor to the end of a text
setSelection(text.length)
// Now we can show a dropdown with full list of options not filtered by displayed text
performFiltering(null, 0)
}
}
}
@Override
protected void onFocusChanged(boolean focused, int direction,
Rect previouslyFocusedRect) {
super.onFocusChanged(focused, direction, previouslyFocusedRect);
if (focused) {
if (getText().toString().length() == 0) {
// We want to trigger the drop down, replace the text.
setText("");
}
}
}
13 回答
当只有一个
InstantAutoComplete
对象时,Destil的代码效果很好 . It didn't work with two though - 不知道为什么 . 但是当我将showDropDown()
(就像CommonsWare建议的那样)放入onFocusChanged()
时,就像这样:它解决了这个问题 .
只是两个答案恰当地结合在一起,但我希望它可以节省一些时间 .
这是我的 class InstantAutoComplete . 它是
AutoCompleteTextView
和Spinner
之间的东西 .像这样在你的xml中使用它:
这对我有用,伪代码:
适配器最初不执行过滤 .
未执行过滤时,下拉列表为空 .
所以你可能必须先进行过滤 .
为此,您可以在添加完条目后调用
filter()
:你可以使用onFocusChangeListener;
这是documented behavior:
您可以通过
showDropDown()
手动显示下拉菜单,因此您可以安排在需要时显示该下拉菜单 . 或者,子类AutoCompleteTextView
并覆盖enoughToFilter()
,一直返回true
.最简单的方法:
只需使用setOnTouchListener和showDropDown()
只需将其粘贴到Java中的onCreate方法即可
这到你的Xml文件......
并在Values ...下的string.xml中创建一个数组
你很高兴 .
只需在触摸时调用此方法或单击autoCompleteTextView的事件或您想要的位置 .
试试吧
七年后,伙计们,问题保持不变 . 这是一个带有函数的类,它强制愚蠢的弹出窗口在任何条件下显示出来 . 您需要做的就是将适配器设置为AutoCompleteTextView,向其中添加一些数据,并随时调用
showDropdownNow()
函数 .@DavidVávra的积分 . 这是基于他的代码 .
上面的Destil的答案几乎可行,但有一个微妙的错误 . 当用户首先将焦点放在字段上时它会工作,但是如果它们离开然后返回到字段,它将不会显示下拉,因为mPopupCanBeUpdated的值在隐藏时仍然是false . 修复方法是将onFocusChanged方法更改为:
制作CustomAutoCompleteTextView . 1.覆盖setThreshold,enoughToFilter,onFocusChanged方法