SearchView图标显示两次

时间:2018-10-20 22:44:25

标签: java android toolbar searchview

我已按照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"

仅此而已。

注意:我尚未实现用于处理搜索的活动/片段。

5 个答案:

答案 0 :(得分:1)

Androidx解决方案

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

布局

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

活动(科林)

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

活动(Java)

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

答案 1 :(得分:0)

最后,我找到了解决方案。这很容易,但是我花了两天时间才弄清楚。

就兼容性问题而言,请使用

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();

答案 2 :(得分:0)

这是此问题的最佳答案

@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;
            }
        });
    }

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

 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 中调用它。