工具栏中的Android Searchview无法在旧版本中使用

时间:2017-09-13 08:42:36

标签: java android toolbar searchview

我的工具栏内部有一个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;
    }

菜单/ 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>

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

编辑: 将监听器附加到searchview也不起作用。

2 个答案:

答案 0 :(得分:2)

不要让新的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;
    }

答案 1 :(得分:0)

使用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-In 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) {

            }
};