【问题标题】:SearchView icon shows twiceSearchView 图标显示两次
【发布时间】:2019-03-25 10:16:18
【问题描述】:

我已经按照 Android 的官方说明在我的工具栏中实现了 SearchView。

SearchView 本身运行良好,但是当我点击搜索图标时,它会向左移动,而不是显示搜索提示和关闭按钮,尽管如果我点击这个“第二个搜索”图标,最终我会得到典型的搜索视图.

这是我的工具栏的xml:

<item android:id="@+id/search"
        android:title="@string/search_view"
    app:showAsAction="collapseActionView|ifRoom"
    android:iconTint="@android:color/white"
        android:icon="@drawable/ic_search_white_24dp"
    app:actionViewClass="android.widget.SearchView" />

还有我的 onCreateOptionsMenu

@Override
    public boolean onCreateOptionsMenu(Menu menu) {

        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.options_menu, menu);

        // Associate searchable configuration with the SearchView
        SearchManager searchManager =
                (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        SearchView searchView =
                (SearchView) menu.findItem(R.id.search).getActionView();

        searchView.setSearchableInfo(
                searchManager.getSearchableInfo(getComponentName()));

        return true;
    }

还有我的 manifest.xml

<activity
            android:name=".Activities.MainActivity"
            android:label="@string/addWordLabel_Act"
            android:launchMode="singleTop"
            android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.intent.action.SEARCH"/>
            </intent-filter>
            <meta-data
                android:name="android.app.searchable"
                android:resource="@xml/searchable" />
        </activity>

最后,这里有一些问题的截图: SearchView before tapping

SearchView after first tap, Here's the problem

SearchView after second tap, "the normal SearchView"

仅此而已。

注意:我还没有实现一个 Activity/Fragment 来处理搜索。

【问题讨论】:

    标签: java android toolbar searchview


    【解决方案1】:

    在调用菜单项之前先清除菜单。

     menu.clear();
    

    完整代码

     @Override
    public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
        menu.clear();
        inflater.inflate(R.menu.main, menu);
        SearchView searchView = (SearchView) menu.findItem(R.id.appSearchBar).getActionView();
        searchView.setQueryHint("Search...");
        searchView.setIconified(false);
    

    onCreateOptionsMenu 被使用,因为我在 Fragment 中调用它。

    【讨论】:

      【解决方案2】:

      如果上述解决方案都不适用于我的情况: 只需将背景颜色设置为 SearchView。 而且您只会看到 1 个放大镜图标。

      【讨论】:

        【解决方案3】:

        这是此问题的最佳答案

        @Override
            public void onCreateOptionsMenu(Menu menu, @NonNull MenuInflater inflater) {
                super.onCreateOptionsMenu(menu, inflater);
                inflater.inflate(R.menu.menu_main, menu);
        
                MenuItem myActionMenuItem = menu.findItem( R.id.action_search);
                final androidx.appcompat.widget.SearchView searchView = (androidx.appcompat.widget.SearchView) myActionMenuItem.getActionView();
                searchView.setOnQueryTextListener(new androidx.appcompat.widget.SearchView.OnQueryTextListener() {
                    @Override
                    public boolean onQueryTextSubmit(String query) {
                        searchView.setQuery("", false);
                        searchView.setIconified(true);
                        return false;
                    }
        
                    @Override
                    public boolean onQueryTextChange(String newText) {
                          //Do your stuff
                        return true;
                    }
                });
            }
        

        【讨论】:

          【解决方案4】:

          Androidx 解决方案

          添加此答案是因为我的声誉不足以回复 Wesley Franks

          布局

          app:actionViewClass="androidx.appcompat.widget.SearchView"
          

          活动(Kotlin)

          menu?.findItem(R.id.search)?.actionView as? androidx.appcompat.widget.SearchView
          

          活动(Java)

          (androidx.appcompat.widget.SearchView) menu.findItem(R.id.search).getActionView();
          

          【讨论】:

            【解决方案5】:

            终于,我得到了解决方案。这很容易,但我花了两天时间试图弄清楚。

            只是,出于兼容性问题,请使用

            app:actionViewClass="android.support.v7.widget.SearchView"
            

            而不是app:actionViewClass="android.widget.SearchView"

            当然还有改变

            SearchManager searchManager =
                            (SearchManager) getSystemService(Context.SEARCH_SERVICE);
                   SearchView searchView =
                            (SearchView) menu.findItem(R.id.search).getActionView();
            

            通过

            SearchManager searchManager =
                            (SearchManager) getSystemService(Context.SEARCH_SERVICE);
                    android.support.v7.widget.SearchView searchView =
                            (android.support.v7.widget.SearchView) menu.findItem(R.id.search).getActionView();
            

            【讨论】:

            • 无法在 androidx 中使用
            猜你喜欢
            • 2020-08-16
            • 2018-03-02
            • 1970-01-01
            • 1970-01-01
            • 2015-07-04
            • 1970-01-01
            • 2017-03-10
            • 2021-08-18
            • 1970-01-01
            相关资源
            最近更新 更多