【问题标题】:Android Searchview in toolbar not working in older versions工具栏中的 Android Searchview 在旧版本中不起作用
【发布时间】:2017-09-13 08:42:36
【问题描述】:

我的工具栏里面有一个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 中输入任何内容时,根本不会调用onQueryTextChange
  • 已调用但未注册触摸事件。我不能回去。当我隐藏键盘时,我无法让它再次弹出。
  • SearchViewnew SearchView(...) 中使用的是什么?来自android.support.v7?
  • 是的 android.support.v7.widget.SearchView
  • 试过android.widget.SearchView?顺便说一句,我同意 Divy Soni 的解决方案,它应该可以这样工作

标签: java android toolbar searchview


【解决方案1】:

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

【讨论】:

  • 尝试在onCreateOptionsMenu而不是onPrepareOptionsMenu中执行此代码
  • 还是一样。
  • 它在 android 4.3 中是否有效。我正在三星 S3 上测试
【解决方案2】:

使用 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 代码中在搜索编辑文本中添加此侦听器

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) {

            }
};

【讨论】:

  • 我之前没有使用过searchview,但无论如何你可以使用本教程代码检查你的代码,以了解你遇到的错误coderwall.com/p/zpwrsg/… 还要注意'support.v7'
猜你喜欢
  • 2016-11-08
  • 2015-10-07
  • 1970-01-01
  • 1970-01-01
  • 2015-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-25
相关资源
最近更新 更多