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

时间:2015-04-20 20:09:07

标签: android toolbar searchview

我有一个新工具栏的活动。在这个工具栏中,我只有一个图标...我的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);
    }

4 个答案:

答案 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)

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

答案 3 :(得分:0)

我不知道这是不是一种坏习惯,但我这样解决了:

@Override
protected void onResume() {
    super.onResume();

    if (searchView != null) {
        if (searchView.getQuery().length() <= 0) {
            searchView.setQuery("", false);
        }
    }

}