您好我的需求我不能使用SearchView,因为我正在过滤包含一些自定义对象的数组列表加上此AutoCompleteTextView作为菜单项嵌入到工具栏中
<item
android:id="@+id/searchFoodMenuItem"
android:title="@string/generic.search"
app:actionLayout="@layout/view_search_food_auto_complete"
android:orderInCategory="1"
android:icon="@drawable/ic_search_white_48dp"
app:showAsAction="ifRoom|collapseActionView"
/>
我希望在这些情况下模仿searchview的行为:
点击图标会将自动完整文本视图置于焦点并显示键盘(我已经实现了这一点,但我有一个小问题需要帮助)
当自动完成文本视图处于焦点时,单击屏幕上不是键盘的任何其他位置将删除自动完成文本视图的焦点,而不是将触摸传递到已按下的视图。
一些代码
所以我编写了自己的AutoCompleteTextView扩展。
以下是一些关键代码段
以下部分只是在视图焦点发生变化时关闭/打开键盘。这还包括单击它并按回软键盘。
@Override
protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {
super.onFocusChanged(focused, direction, previouslyFocusedRect);
InputMethodManager inputMethodManager = (InputMethodManager) getContext()
.getSystemService(Context.INPUT_METHOD_SERVICE);
if (focused) {
inputMethodManager.showSoftInput(this, 0);
} else {
setFocusableInTouchMode(false);
inputMethodManager.hideSoftInputFromWindow(getWindowToken(), 0);
}
}
@Override
public boolean performClick() {
setFocusableInTouchMode(true);
requestFocus();
return super.performClick();
}
@Override
public boolean onKeyPreIme(int keyCode, KeyEvent event) {
if (event.getKeyCode() == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) {
clearFocus();
}
return false;
}
以下是在展开菜单项时将视图置于焦点的代码
MenuItemCompat.setOnActionExpandListener(mSearchFoodMenuItem, new MenuItemCompat.OnActionExpandListener() {
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
mSearchFoodInputField.post(new Runnable() {
@Override
public void run() {
DebugUtils.Log("onMenuItemActionExpand");
mSearchFoodInputField.requestFocus();
}
});
return true;
}
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
return true;
}
});
以上是第一次工作,即如果我点击菜单项,则自动完成文本视图变得聚焦并且键盘出现。一切都很好,但如果我折叠这个菜单项并再次执行,它不再变得专注,我不知道为什么。
我没有使用SearchView的更多理由
我不想使用它的主要原因是因为我想根据我的数组对象列表显示搜索建议。我对API的理解告诉我,搜索视图只能在数据库Cursor(我不使用)上执行此操作
搜索视图代码
菜单
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/action_search"
android:title="@string/generic.search"
android:icon="@drawable/ic_search_white_48dp"
app:showAsAction="ifRoom|collapseActionView"
android:iconifiedByDefault="true"
app:actionViewClass="android.support.v7.widget.SearchView" />
</menu>
on onCreateOptionsMenu
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.piece_discover_menu, menu);
mSearchMenuItem = menu.findItem(R.id.action_search);
mSearchView = (SearchView) MenuItemCompat.getActionView(mSearchMenuItem);
mSearchView.setOnQueryTextListener(this);
mSearchView.setOnSuggestionListener(this);
mSearchView.setSuggestionsAdapter(mFoodSearchAdapter);
}
以下是我试过的内容
我做了一个可搜索的配置
注意我尝试使用和不使用completetionThreshold
<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
android:hint=“@string/search_hint”
android:searchSuggestThreshold=“1”
android:completionThreshold=“1”
</searchable>
我应用搜索配置
请注意,这是在应用程序标记之间声明的
<meta-data android:name="android.app.searchable"
android:resource="@xml/searchable" />
我添加搜索管理器
SearchManager searchManager =
(SearchManager) getActivity().getSystemService(Context.SEARCH_SERVICE);
mSearchView.setSearchableInfo(
searchManager.getSearchableInfo(getActivity().getComponentName()));
答案 0 :(得分:1)
感谢pskink,我使用的是搜索视图。为了获得像AutoCompleteTextView这样的建议我使用了cursorAdapter。但是,如果像我一样你有一个Java对象的数组列表,你需要将其转换为Cursor,如下所示。
public static final String[] COLUMNS = new String[]{"_id","foodName","foodReference"};
public static final int ID_INDEX = 0, FOOD_NAME_INDEX = 1, FOOD_REFERENCE_INDEX = 2;
private MatrixCursor convertToCursor (ArrayList<Food> foods){
MatrixCursor cursor = new MatrixCursor(COLUMNS);
for(Food food : foods){
String[]row = new String[COLUMNS.length];
row[ID_INDEX] = Integer.toString(mFoods.indexOf(food));
row[FOOD_NAME_INDEX] = food.getName();
row[FOOD_REFERENCE_INDEX] = food.getReferenceNumber();
cursor.addRow(row);
}
return cursor;
}