Android 工具栏中的搜索视图在旧版本中不起作用

Android Searchview in toolbar not working in older versions

我的工具栏内部有一个 searchView 并且都没有在 android 4.3 上注册任何触摸事件(实际上事件转到它们下面的视图)。它应该注册 homeAsUpsearchView 字段 (requestFocus) 和 X 按钮以清除该字段。现在我想的是将听众附加到这些但有没有更好的方法。

@Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        super.onPrepareOptionsMenu(menu);
        MenuItem menuItem = menu.findItem(R.id.app_bar_search);
        SearchView searchView = new SearchView(this);
        searchView.setIconifiedByDefault(false);
        searchView.setIconified(false);
        searchView.requestFocus();
        searchView.setMaxWidth(Integer.MAX_VALUE);
        searchView.setQueryHint(getString(R.string.search));

        ImageView searchViewIcon = (ImageView)searchView.findViewById(android.support.v7.appcompat.R.id.search_mag_icon);
        ViewGroup linearLayoutSearchView =(ViewGroup) searchViewIcon.getParent();
        linearLayoutSearchView.removeView(searchViewIcon);

        menuItem.setActionView(searchView);
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) { return false; }

            @Override
            public boolean onQueryTextChange(String newText) {
                presenter.queryChanged(newText);
                return true;
            }
        });

        return true;
    }

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.search, menu);
        return true;
    }

menu/search.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:id="@+id/app_bar_search"
        app:actionViewClass="android.support.v7.widget.SearchView"
        android:icon="@drawable/ic_search_white_24dp"
        android:title="@string/search"
        app:showAsAction="always" />
</menu>

它在较新版本中工作正常(不知道哪个是 working/not 工作之间的边界)。

编辑: 将侦听器附加到搜索视图也不起作用。

不要让 SearchView 的新实例从 menuItem 中获取它:

替换此行

SearchView searchView = new SearchView(this);

SearchView searchView = (SearchView) menuItem .getActionView();

并删除以下行:

menuItem.setActionView(searchView);

以下代码对我来说工作正常:

@Override
    public boolean onCreateOptionsMenu( Menu menu) {
        getMenuInflater().inflate( R.menu.menu_main, menu);

        MenuItem myActionMenuItem = menu.findItem( R.id.action_search);
        final SearchView searchView = (SearchView) myActionMenuItem.getActionView();
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                if (TextUtils.isEmpty(newText)) {
                    adapter.filter("");
                    listView.clearTextFilter();
                } else {
                    adapter.filter(newText);
                }
                return true;
            }
        });

        return true;
    }

如何使用 EditText 来实现...所有版本都将 运行。

1- 在 YourActivity.xml 中删除 android.support.design.widget.AppBarLayout 属性然后添加

<android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            app:popupTheme="@style/AppTheme.PopupOverlay" >

            <EditText
                android:id="@+id/search_edit_text"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_marginStart="24dp"
                android:backgroundTint="[TINT_COLOR]"
                android:hint="Search"
                android:inputType="[INPUT TYPE]"
                android:textColorHint="[HINT_COLOR]"
                android:layout_marginEnd="16dp"/>

</android.support.v7.widget.Toolbar>

2-在 YourActivity.java 代码中添加此侦听器搜索 edittext

private TextWatcher searchTextWatcher =
        new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

            }

            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                presenter.queryChanged(charSequence.toString());
            }

            @Override
            public void afterTextChanged(Editable editable) {

            }
};