如何以编程方式打开搜索建议列表?
How to open list of search suggestions programatically?
我的 Android 应用程序中有一个 SearchView
,它可以显示对给定输入的建议。现在我想要以下行为:如果我完成键盘输入并按下软键盘上的 "enter" 按钮,那么我希望键盘消失但包含搜索建议的列表应该保留。
现在的行为是,如果我输入一些字母,建议就会出现(好!)但是如果我完成并按回车,列表就会消失(不好!)。
那么如何重新打开列表但隐藏键盘呢?
通常,意图 ACTION_SEARCH 会被触发并以新的 activity 打开并显示搜索结果的方式进行处理。我只想打开带有建议的列表。
部分源码:
在 AddTeam 的 onCreate() 中 Class:
SearchView searchView= (SearchView) findViewById(R.id.searchView);
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener(){
@Override
public boolean onQueryTextSubmit(String s) {
InputMethodManager inputManager = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
return false;
}
@Override
public boolean onQueryTextChange(String s) {
return false;
}
});
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
意图处理:
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
handleIntent(intent);
}
private void handleIntent(Intent intent) {
if (Intent.ACTION_VIEW.equals(intent.getAction())) {
// handles a click on a search suggestion; launches activity to show word
Uri uri = intent.getData();
Cursor cursor = managedQuery(uri, null, null, null, null);
if (cursor == null) {
finish();
} else {
cursor.moveToFirst();
doMoreCode();
}
} else if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
// handles a search query
String query = intent.getStringExtra(SearchManager.QUERY);
//////////////////////////////////////////////////////
//WANTED FEATURE!
OpenSearchSuggestionsList();
//WANTED FEATURE!
//////////////////////////////////////////////////////
}
}
清单:
<activity
android:name=".AddTeam"
android:configChanges="keyboard|screenSize|orientation"
android:label="@string/title_activity_teamchooser"
android:launchMode="singleTop" >
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
</intent-filter>
</activity>
可搜索:
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
android:label="@string/title_activity_settings"
android:hint="@string/search_hint"
android:searchSettingsDescription="Enter Word"
android:searchSuggestAuthority="com.mypackage.DataProvider"
android:searchSuggestIntentAction="android.intent.action.VIEW"
android:searchSuggestIntentData="content://com.mypackage.DataProvider/teamdaten"
android:searchSuggestSelection=" ?"
android:searchSuggestThreshold="1"
android:includeInGlobalSearch="true"
>
</searchable>
AddTeam 布局的一部分 xml:
<android.support.v7.widget.SearchView
android:id="@+id/searchView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:textColor="#000000"
volleyballinfo:iconifiedByDefault="false"
volleyballinfo:queryHint="@string/search_hint"/>
在您的搜索视图中有一个名为 onQueryTextSubmit
的覆盖方法,您可以先尝试从该方法中仅 return false。
如果上面的方法不起作用,试试这个,
@Override
public boolean onQueryTextSubmit(String query) {
InputMethodManager inputManager = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
return false;
}
希望这对您有所帮助:)
注意:我的回答仅基于源代码检查,可能不会产生positive/favorable结果。另外,下面的代码是凭记忆写的 - 它可能包含拼写错误。
好的。在内部,SearchView
使用自定义 AutoCompleteTextView
来显示建议。此自定义 AutoCompleteTextView
通过多个渠道侦听 submit 事件:View.OnKeyListener
,已覆盖 SearchView#onKeyDown(int, KeyEvent)
和 OnEditorActionListener
。
在 submit 事件中(当按下 ENTER
键时 - 在您的情况下),使用 SearchView#dismissSuggestions
关闭建议弹出窗口:
private void dismissSuggestions() {
mSearchSrcTextView.dismissDropDown();
}
如您所见,SearchView#dismissSuggestions()
调用了 AutoCompleteTextView#dismissDropDown()
。因此,要显示下拉列表,我们应该能够调用 AutoCompleteTextView#showDropDown()
。
但是,SearchView
使用的自定义 AutoCompleteTextView
实例是私有的,没有定义访问器。在这种情况下,我们可以尝试找到这个View
,将它转换为AutoCompleteTextView
,然后调用showDropDown()
。
....
// Your snippet
else if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
// handles a search query
String query = intent.getStringExtra(SearchManager.QUERY);
OpenSearchSuggestionsList(searchView);
}
....
// Edited
// This method will accept the `SearchView` and traverse through
// all of its children. If an `AutoCompleteTextView` is found,
// `showDropDown()` will be called on it.
private void OpenSearchSuggestionsList(ViewGroup viewGroup) {
for (int i = 0; i < viewGroup.getChildCount(); i++) {
View child = viewGroup.getChildAt(i);
if (child instanceof ViewGroup) {
OpenSearchSuggestionsList((ViewGroup)child);
} else if (child instanceof AutoCompleteTextView) {
// Found the right child - show dropdown
((AutoCompleteTextView)child).showDropDown();
break; // We're done
}
}
}
期待您对此发表评论。
这会有所帮助,请注意使用应用程序兼容库中的 R
导入 android.support.v7.appcompat.R
mQueryTextView = (AutoCompleteTextView) searchView.findViewById(R.id.search_src_text);
mQueryTextView.showDropDown()
被接受的答案是一个很好的答案,并引导我得出另一个可能对其他人有益的简单答案:
private void OpenSearchSuggestionsList() {
int autoCompleteTextViewID = getResources().getIdentifier("search_src_text", "id", getPackageName());
AutoCompleteTextView searchAutoCompleteTextView = searchView.findViewById(autoCompleteTextViewID);
searchAutoCompleteTextView.showDropDown();
}
我的 Android 应用程序中有一个 SearchView
,它可以显示对给定输入的建议。现在我想要以下行为:如果我完成键盘输入并按下软键盘上的 "enter" 按钮,那么我希望键盘消失但包含搜索建议的列表应该保留。
现在的行为是,如果我输入一些字母,建议就会出现(好!)但是如果我完成并按回车,列表就会消失(不好!)。
那么如何重新打开列表但隐藏键盘呢?
通常,意图 ACTION_SEARCH 会被触发并以新的 activity 打开并显示搜索结果的方式进行处理。我只想打开带有建议的列表。
部分源码:
在 AddTeam 的 onCreate() 中 Class:
SearchView searchView= (SearchView) findViewById(R.id.searchView);
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener(){
@Override
public boolean onQueryTextSubmit(String s) {
InputMethodManager inputManager = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
return false;
}
@Override
public boolean onQueryTextChange(String s) {
return false;
}
});
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
意图处理:
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
handleIntent(intent);
}
private void handleIntent(Intent intent) {
if (Intent.ACTION_VIEW.equals(intent.getAction())) {
// handles a click on a search suggestion; launches activity to show word
Uri uri = intent.getData();
Cursor cursor = managedQuery(uri, null, null, null, null);
if (cursor == null) {
finish();
} else {
cursor.moveToFirst();
doMoreCode();
}
} else if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
// handles a search query
String query = intent.getStringExtra(SearchManager.QUERY);
//////////////////////////////////////////////////////
//WANTED FEATURE!
OpenSearchSuggestionsList();
//WANTED FEATURE!
//////////////////////////////////////////////////////
}
}
清单:
<activity
android:name=".AddTeam"
android:configChanges="keyboard|screenSize|orientation"
android:label="@string/title_activity_teamchooser"
android:launchMode="singleTop" >
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
</intent-filter>
</activity>
可搜索:
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
android:label="@string/title_activity_settings"
android:hint="@string/search_hint"
android:searchSettingsDescription="Enter Word"
android:searchSuggestAuthority="com.mypackage.DataProvider"
android:searchSuggestIntentAction="android.intent.action.VIEW"
android:searchSuggestIntentData="content://com.mypackage.DataProvider/teamdaten"
android:searchSuggestSelection=" ?"
android:searchSuggestThreshold="1"
android:includeInGlobalSearch="true"
>
</searchable>
AddTeam 布局的一部分 xml:
<android.support.v7.widget.SearchView
android:id="@+id/searchView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:textColor="#000000"
volleyballinfo:iconifiedByDefault="false"
volleyballinfo:queryHint="@string/search_hint"/>
在您的搜索视图中有一个名为 onQueryTextSubmit
的覆盖方法,您可以先尝试从该方法中仅 return false。
如果上面的方法不起作用,试试这个,
@Override
public boolean onQueryTextSubmit(String query) {
InputMethodManager inputManager = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
return false;
}
希望这对您有所帮助:)
注意:我的回答仅基于源代码检查,可能不会产生positive/favorable结果。另外,下面的代码是凭记忆写的 - 它可能包含拼写错误。
好的。在内部,SearchView
使用自定义 AutoCompleteTextView
来显示建议。此自定义 AutoCompleteTextView
通过多个渠道侦听 submit 事件:View.OnKeyListener
,已覆盖 SearchView#onKeyDown(int, KeyEvent)
和 OnEditorActionListener
。
在 submit 事件中(当按下 ENTER
键时 - 在您的情况下),使用 SearchView#dismissSuggestions
关闭建议弹出窗口:
private void dismissSuggestions() {
mSearchSrcTextView.dismissDropDown();
}
如您所见,SearchView#dismissSuggestions()
调用了 AutoCompleteTextView#dismissDropDown()
。因此,要显示下拉列表,我们应该能够调用 AutoCompleteTextView#showDropDown()
。
但是,SearchView
使用的自定义 AutoCompleteTextView
实例是私有的,没有定义访问器。在这种情况下,我们可以尝试找到这个View
,将它转换为AutoCompleteTextView
,然后调用showDropDown()
。
....
// Your snippet
else if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
// handles a search query
String query = intent.getStringExtra(SearchManager.QUERY);
OpenSearchSuggestionsList(searchView);
}
....
// Edited
// This method will accept the `SearchView` and traverse through
// all of its children. If an `AutoCompleteTextView` is found,
// `showDropDown()` will be called on it.
private void OpenSearchSuggestionsList(ViewGroup viewGroup) {
for (int i = 0; i < viewGroup.getChildCount(); i++) {
View child = viewGroup.getChildAt(i);
if (child instanceof ViewGroup) {
OpenSearchSuggestionsList((ViewGroup)child);
} else if (child instanceof AutoCompleteTextView) {
// Found the right child - show dropdown
((AutoCompleteTextView)child).showDropDown();
break; // We're done
}
}
}
期待您对此发表评论。
这会有所帮助,请注意使用应用程序兼容库中的 R 导入 android.support.v7.appcompat.R
mQueryTextView = (AutoCompleteTextView) searchView.findViewById(R.id.search_src_text);
mQueryTextView.showDropDown()
被接受的答案是一个很好的答案,并引导我得出另一个可能对其他人有益的简单答案:
private void OpenSearchSuggestionsList() {
int autoCompleteTextViewID = getResources().getIdentifier("search_src_text", "id", getPackageName());
AutoCompleteTextView searchAutoCompleteTextView = searchView.findViewById(autoCompleteTextViewID);
searchAutoCompleteTextView.showDropDown();
}