如何处理Android中搜索视图(Search View)的返回按钮

15

我开发了一个应用程序,其中有一个位于操作栏中的搜索视图,当我进行搜索时,它可以完美地过滤数据,但当我按下返回按钮时,它仍然显示已过滤的数据。我的问题是:操作栏搜索视图的返回按钮事件是什么?

输入图片描述

我的搜索视图代码如下:

SearchView searchView = (SearchView) MenuItemCompat.getActionView(menu.findItem(Menus.SEARCH));
    searchView.setQueryHint(this.getString(R.string.search));
    editSearch = (EditText) searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text);
    editSearch.setHintTextColor(getResources().getColor(R.color.white));
    searchView.setOnQueryTextListener(OnQuerySearchView);


 private OnQueryTextListener OnQuerySearchView = new OnQueryTextListener() {

    @Override
    public boolean onQueryTextSubmit(String newText) {
        if (TextUtils.isEmpty(newText)) {
            listAllContact.clearTextFilter();
        } else {
            listAllContact.setFilterText(newText.toString());
        }
        return true;
    }

    @Override
    public boolean onQueryTextChange(String newText) {
        String text = editSearch.getText().toString()
                .toLowerCase(Locale.getDefault());
        adapter.filter(text);
        return true;
    }

};

适配器中的过滤方法

public void filter(String charText) {
    charText = charText.toLowerCase(Locale.getDefault());
    propertyList.clear();

    if (charText.length() == 0) {
       propertyList.addAll(arrayList);
    notifyDataSetChanged();

    } else {
        for (ContactProperty p : arrayList) {
            if (p.getFriendName().toLowerCase(Locale.getDefault())
                    .contains(charText)) {
                propertyList.add(p);
            }
        }
        notifyDataSetChanged();

    }
6个回答

13
您可以添加监听器,方法如下:
MenuItem searchMenuItem = menu.findItem(R.id.menu_search);
    searchMenuItem.setOnActionExpandListener(new MenuItem.OnActionExpandListener() {

        @Override
        public boolean onMenuItemActionExpand(MenuItem item) {
            // Do whatever you need
            return true; // KEEP IT TO TRUE OR IT DOESN'T OPEN !!
        }

        @Override
        public boolean onMenuItemActionCollapse(MenuItem item) {
            // Do whatever you need
            return true; // OR FALSE IF YOU DIDN'T WANT IT TO CLOSE!
        }
    });

这非常有帮助。谢谢。 - Neela
这个监听器对我不起作用。你是否使用了Support Library中的SearchView?我不得不使用setOnSearchClickListenersetOnCloseListener作为替代方案:https://stackoverflow.com/a/56410389/7767664 - user924
只有在搜索视图始终展开(标记为“collapseActionView”)时才能正常工作。 - user924

7
您只需要在菜单布局中添加“collapseActionView”属性。
<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/menu_item_search"
        android:title="@string/search"
        android:iconifiedByDefault="true"
        android:icon="@drawable/ic_action_search" 
        app:actionViewClass="android.support.v7.widget.SearchView"
        app:showAsAction="ifRoom|collapseActionView"/> <--this one
</menu>

这将为您提供您所寻求的功能。


5
当搜索操作项目失去焦点时,它将被折叠起来:
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
    getMenuInflater().inflate(R.menu.main_menu, menu);
    searchItem = menu.findItem(R.id.action_search);
    searchView = (SearchView) MenuItemCompat.getActionView(searchItem);

    // be sure to use 'setOnQueryTextFocusChangeListener()'
    searchView.setOnQueryTextFocusChangeListener(new View.OnFocusChangeListener()
    {
        @Override
        public void onFocusChange(View v, boolean newViewFocus)
        {
            if (!newViewFocus)
            {
                //Collapse the action item.
                searchItem.collapseActionView();
                //Clear the filter/search query.
                myFilterFunction("");
            }
        }
    });

    return super.onCreateOptionsMenu(menu);
}

这是我找到的唯一成功折叠搜索项操作视图并在按下返回按钮时实现的方法。


这解决了我的问题,因为搜索操作栏的showAsAction设置为ifRoom|collapseActionView。其他方法都没用,android.R.id.home没有被触发或者没有任何反应。谢谢! - Mikkel Larsen
正确处理后退按钮的方法在这里:https://dev59.com/mVUM5IYBdhLWcg3wWvDF#48989340 - AndroidTank

3

试试这个:

  MenuItemCompat.setOnActionExpandListener(searchItem, new MenuItemCompat.OnActionExpandListener() {
        @Override
        public boolean onMenuItemActionCollapse(MenuItem item) {
            // Do something when collapsed
            return true;  // Return true to collapse action view
        }

        @Override
        public boolean onMenuItemActionExpand(MenuItem item) {
            return true;  
        }
    });

1
这种方法已经过时了,这里有一个新的:https://dev59.com/mVUM5IYBdhLWcg3wWvDF#48989340 - AndroidTank

1
在清单文件中,
处理操作栏返回按钮的部分 - 首先需要定义父活动。
例如 -
        android:name="com.android.unum.ui.SelfServiceActivity"
        android:label="@string/self_service"
        android:parentActivityName="com.android.unum.ui.DashboardActivity" >
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.android.unum.ui.DashboardActivity" />

编辑位于 Activity 中的 onOptionsItemSelected 方法。

NavUtils.navigateUpFromSameTask(this);

//public static void navigateUpFromSameTask (Activity sourceActivity) //此调用将关闭sourceActivity。 //注:仅当sourceActivity和相应的父项位于同一任务中时,才应使用此方法。
//更多信息请参阅:

http://developer.android.com/reference/android/support/v4/app/NavUtils.html

像这样

@Override

public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    // Respond to the action bar's Up/Home button
    case android.R.id.home:
        NavUtils.navigateUpFromSameTask(this);
        return true;
    }
    return super.onOptionsItemSelected(item);
}

1
你将无法直接获取搜索视图导航点击的直接事件,但有一个名为“MenuItem.OnActionExpandListener()”的菜单项接口。通过使用此接口,您可以获得展开和折叠的回调。
请使用以下代码片段:
MenuItem searchMenuItem = menu.findItem(R.id.action_search);
searchMenuItem.setOnActionExpandListener(new MenuItem.OnActionExpandListener() {
            @Override
            public boolean onMenuItemActionExpand(MenuItem item) {
                return true;
            }

            @Override
            public boolean onMenuItemActionCollapse(MenuItem item) {
                return true;
            }
        });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接