【问题标题】:Prevent activity to reload when clicking on SearchView单击 SearchView 时防止重新加载活动
【发布时间】:2015-06-27 17:47:35
【问题描述】:

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

编辑:

加:当点击图标时,它会重新加载活动并打开 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);
    }

【问题讨论】:

    标签: android toolbar searchview


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      在您的 onQueryTextSubmit 方法中执行以下操作: searchView.setQuery (query, false);

      【讨论】:

        【解决方案3】:

        我不知道这是否是一种不好的做法,但我是这样解决的:

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

        【讨论】:

          【解决方案4】:

          你不能。不幸的是,每个人都有同样的问题。 searchViews 总是在打开查询时调用它。没有办法避免它。我见过有些人首先调用了一个布尔值并将其设置为true。那么只有在它是假的时候才做逻辑。然后在第一个查询调用中将其设置为 false。这不是一个好方法,但它应该可以工作

          【讨论】:

          • 但是例如...whatsapp 具有几乎相同的功能,但屏幕不会重新加载。也许我表达自己错了。 SearchView 位于 MainActivity 工具栏,并重新加载 MainActivity。在我按下搜索图标后,我的 SearchResult 活动被调用。
          猜你喜欢
          • 1970-01-01
          • 2021-03-01
          • 1970-01-01
          • 2011-09-21
          • 1970-01-01
          • 1970-01-01
          • 2019-04-12
          • 2012-03-21
          • 1970-01-01
          相关资源
          最近更新 更多