我有一个新工具栏的活动。在这个工具栏中,我只有一个图标...我的SearchView图标。当我点击该图标时,它会在工具栏中打开一个EditText,并且能够编写我正在寻找的内容。问题是当我点击搜索图标时,我的Activity(FrameLayout with fragment)的内容被重新加载。
编辑:
plus:当点击图标时,它会重新加载活动并打开EditText,然后调用Activity SearchResult,如果我按下该活动中的后退按钮,我将返回MainActivity,搜索视图仍然打开。
如何预防?
这是我的Manifest搜索部分(MainActivity有图标):
<meta-data
android:name="android.app.default_searchable"
android:value=".activity.SearchResult_" />
<activity
android:name=".activity.MainActivity_"
android:configChanges="orientation|keyboardHidden|screenSize"
android:label="@string/app_name"
android:screenOrientation="portrait" >
</activity>
<activity
android:name=".activity.SearchResult_"
android:label="@string/title_activity_search_result"
android:screenOrientation="portrait" >
<meta-data
android:name="android.app.searchable"
android:resource="@xml/searchable" />
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
</intent-filter>
</activity>
我的OnCreateOptionsMenu:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
MenuItem searchItem = menu.findItem(R.id.action_search);
SearchManager searchManager = (SearchManager) MainActivity.this.getSystemService(Context.SEARCH_SERVICE);
SearchView.OnQueryTextListener queryTextListener = new SearchView.OnQueryTextListener()
{
public boolean onQueryTextChange(String newText)
{
Log.d("Query", newText);
return true;
}
public boolean onQueryTextSubmit(String query)
{
Log.d("Search", query);
SearchResult_.intent(MainActivity.this).extra("query", query).start();
return true;
}
};
SearchView searchView = null;
if (searchItem != null) {
searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
}
if (searchView != null) {
searchView.setSearchableInfo(searchManager.getSearchableInfo(MainActivity.this.getComponentName()));
}
return super.onCreateOptionsMenu(menu);
}
答案 0 :(得分:1)
在你的onQueryTextSubmit方法中执行:
searchView.setQuery (query, false);
答案 1 :(得分:1)
我知道我对线程迟到了,但这是正确的解决方案。 SearchView默认行为的工作方式是,它将自动将ACTION.SEARCH意图发送到清单中声明的可搜索活动。发送后,它将创建该活动的新实例,以便可以调用onCreate()方法并可以处理意图。
为了解决此问题,只需将可搜索活动的launchMode声明为'SingleTop'。 android:launchMode="singleTop"
根据Android文档中的“ singleTop” (https://developer.android.com/guide/components/activities/tasks-and-back-stack): “如果活动的一个实例已经存在于当前任务的顶部,则系统通过调用其onNewIntent()方法将意图路由到该实例,而不是创建活动的新实例。”如果将可搜索活动声明为“ singleTop”,请确保您覆盖onNewIntent()并相应地处理ACTION.SEARCH意向数据。
答案 2 :(得分:0)
答案 3 :(得分:0)
我不知道这是不是一种坏习惯,但我这样解决了:
@Override
protected void onResume() {
super.onResume();
if (searchView != null) {
if (searchView.getQuery().length() <= 0) {
searchView.setQuery("", false);
}
}
}