我在andriod中使用搜索界面,然后在android指南中设置了界面。
我创建了一个SearchableActivity,它将处理用户输入的搜索结果。
现在我遇到一个问题,当用户输入SearchView
中的某些内容并点击搜索键时,搜索重新设置将被提交,然后我将收到查询字符串并进行搜索,但此时此刻,SearchView
中的文本已更改为默认SearchHit
值,而我希望它是查询字符串。
所以我尝试使用searchView.setQuery(query, false);
,但它不起作用,有什么问题?
核心活动代码:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.map_activity_layout);
Log.d("map", "create");
handleIntent(getIntent());
}
public void onNewIntent(Intent intent) {
setIntent(intent);
handleIntent(intent);
}
private void handleIntent(Intent intent) {
Log.d("map", "handleIntent");
if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
String query = intent.getStringExtra(SearchManager.QUERY);
//try search
Log.d("map", "search and set query:" + query);
searchView.setQuery(query, false); // reset the value in of the SearchView
}
}
AndroidManifest.xml:
<activity
android:name=".ui.MapActivity"
android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<action android:name="android.intent.action.SEARCH" />
</intent-filter>
<meta-data
android:name="android.app.searchable"
android:resource="@xml/searchable" />
</activity>
答案 0 :(得分:12)
我建议您将设置延迟到下一个事件循环(将其添加到消息队列),因此代码可能如下所示:
private void handleIntent(Intent intent) {
if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
final String query = intent.getStringExtra(SearchManager.QUERY);
searchView.post(new Runnable() {
@Override
public void run() {
// Important! Make sure searchView has been initialized
// and referenced to the correct (current) SearchView.
// Config changes (e.g. screen rotation) may make the
// variable value null.
searchView.setQuery(query, false);
}
};
}
}
答案 1 :(得分:11)
这不起作用
mSearchView.setQuery(mKeyword, true);
MenuItemCompat.expandActionView(mMenuSearch);
这样做
MenuItemCompat.expandActionView(mMenuSearch);
mSearchView.setQuery(mKeyword, true);
在扩展操作视图后,它似乎只会记住它。 我只是为了向后兼容而使用MenuItemCompat
答案 2 :(得分:3)
需要使用MenuItemCompat
将代码放在post处理程序中inflater.inflate(R.menu.menu_my_team, menu);
// search manager integration for search widget
SearchManager searchManager = (SearchManager) getActivity()
.getSystemService(Context.SEARCH_SERVICE);
final MenuItem searchMenuItem = menu.findItem(R.id.action_search);
// MenuItem helpTutorialMenuItem = menu.findItem(R.id.action_help);
mSearchView = (SearchView) MenuItemCompat.getActionView(searchMenuItem);
mSearchView.setSearchableInfo(searchManager
.getSearchableInfo(getActivity().getComponentName()));
mSearchView.setQueryHint("Search by");
if (!TextUtils.isEmpty(queryText)) {
mSearchView.post(new Runnable() {
@Override
public void run() {
MenuItemCompat.expandActionView(searchMenuItem);
mSearchView.setQuery(queryText, false);
}
});
}
mSearchView.clearFocus();
答案 3 :(得分:1)
当收到Action Intent.ACTION_SEARCH
的意图时,似乎会调用以下方法:
handleIntent();
onCreateOptionsMenu();
handleIntent
将在onCreateOptionsMenu
之前运行。
与此同时,人们过去常常在searchView
设置onCreateOptionsMenu
。
这意味着选项菜单将重新膨胀,searchView
将重新构建,然后handleIntent
中的所有设置都将无效。
我认为这就是原因。
如果我错了,请随时修理我。