单击SearchView时阻止活动重新加载

我有一个新工具栏的活动。 在这个工具栏中,我只有一个图标…我的SearchView图标。 当我点击该图标时,它会在工具栏中打开一个EditText,并且能够编写我正在寻找的内容。 问题是当我点击搜索图标时,我的Activity(带片段的FrameLayout)的内容被重新加载。

编辑:

加:当点击图标时,它会重新加载活动并打开EditText,然后调用Activity SearchResult,如果我按下该活动中的后退按钮,我将返回MainActivity并仍然打开搜索视图。

怎么预防?

这是我的Manifest搜索部分(MainActivity有图标):

         

Thast我的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); } 

你不能。 不幸的是,每个人都有同样的问题。 searchViews在打开时始终调用查询。 没办法避免它。 我看到有些人有一个名为first的布尔值并将其设置为true。 如果它是假的,那么只做逻辑。 然后在第一个查询调用中将其设置为false。 不是一个好方法,但它应该工作

我不知道这是不是一种不好的做法,但我这样修理:

 @Override protected void onResume() { super.onResume(); if (searchView != null) { if (searchView.getQuery().length() <= 0) { searchView.setQuery("", false); } } } 

在你的onQueryTextSubmit方法中执行: searchView.setQuery (query, false);

我知道我迟到了,但这是正确的解决方案。 SearchView默认行为的工作方式是它会自动向您在清单中声明的​​可搜索活动发送ACTION.SEARCH意图。 发送时,它将创建该活动的新实例,以便可以调用onCreate()方法并处理intent。

要解决此问题,只需将可搜索活动的launchMode声明为“SingleTop”即可。 android:launchMode="singleTop"

根据Android文档“singleTop”( https://developer.android.com/guide/components/activities/tasks-and-back-stack ):“如果活动的实例已存在于当前任务的顶部,系统通过调用onNewIntent()方法将意图路由到该实例,而不是创建活动的新实例。 如果将可搜索活动声明为“singleTop”,请确保覆盖onNewIntent()并相应地处理ACTION.SEARCH目标数据。