简体   繁体   English

工具栏中的Android Searchview在旧版本中不起作用

[英]Android Searchview in toolbar not working in older versions

My toolbar has a searchView inside and both ate not registering any touch events on android 4.3 (in fact the event goes to the view below them). 我的工具栏内部有一个searchView ,两个都没有在android 4.3上注册任何触摸事件(实际上该事件进入了它们下面的视图)。 It should register homeAsUp , the searchView field ( requestFocus ) and X button to clear the field. 它应该注册homeAsUpsearchView字段( requestFocus )和X按钮以清除该字段。 For now what I am thinking is attaching listeners to these but is there a better way. 目前,我在想让听众加入这些话题,但有没有更好的办法。

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

It works fine in newer versions though (don't know which one is the border between working/not working). 不过,它在较新的版本中可以正常工作(不知道哪个是工作与不工作之间的边界)。

EDIT: Attaching a listener to the searchview doesn't work either. 编辑:将侦听器附加到searchview也不起作用。

don't make new instance of SearchView fetch it from the menuItem: 不要使SearchView的新实例从menuItem中获取:

replace this line 替换这条线

SearchView searchView = new SearchView(this);

with

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

and remove following line: 并删除以下行:

menuItem.setActionView(searchView);

following code is working fine for me: 以下代码对我来说很好用:

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

what about doing it using EditText ... it is going to run for all versions. 使用EditText怎么办...它将在所有版本上运行。

1- In YourActivity.xml remove android.support.design.widget.AppBarLayout attribute then add 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 code add this listener on search edittext 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) {

            }
};

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM