单击后退在SearchView中重置搜索

时间:2014-05-24 10:28:44

标签: java android android-actionbar searchview android-searchmanager

我添加了搜索菜单项来过滤我的列表。过滤和重置过滤器一切正常。 但是当用户点击后退按钮时,我找不到重置过滤器的方法。实际上,当用户在搜索字段中添加一些文本时,第一次单击将隐藏键盘,第二次单击将折叠搜索字段并删除我的搜索文本...但列表仍然已过滤。 我该怎么做才能重置列表?

@Override
public boolean onCreateOptionsMenu(Menu menu) {

    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.search_menu, menu);

    searchMenuItem = menu.findItem(R.id.action_search);
    SearchView mSearchView = (SearchView) MenuItemCompat.getActionView(searchMenuItem);

    if (mSearchView != null) {
        mSearchView.setIconifiedByDefault(true);
        mSearchView.setOnQueryTextListener(this);
    }
    return super.onCreateOptionsMenu(menu);
}

@Override
public boolean onQueryTextChange(String s) {
    refreshSearch(s);
    return false;
}

private void refreshSearch(String s) {
    FragmentManager fm = getSupportFragmentManager();
    MyListFragment listFragment = (MyListFragment)fm.getFragments().get(0);
    MyArrayAdapter arrayAdapter = (MyArrayAdapter)listFragment.getListAdapter();
    arrayAdapter.getFilter().filter(s);
}

通过添加一些额外的代码来编辑我的问题,这可能有助于了解原因

@Override
public boolean onQueryTextSubmit(String s) {
    hideKeyboard();
    return false;
}
@Override
public boolean onQueryTextChange(String s) {
    refreshSearch(s);
    return false;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle presses on the action bar items
    switch (item.getItemId()) {
        case R.id.action_search:
            return true;
        default:
            return false; //return super.onOptionsItemSelected(item);
    }
}

4 个答案:

答案 0 :(得分:2)

我通过这样做来解决问题:

searchMenuItem.setOnActionExpandListener(new MenuItem.OnActionExpandListener() {

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

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

答案 1 :(得分:0)

您需要在活动中覆盖onBackPressed()

@Override
public void onBackPressed() {
    if (mSearchView != null && !mSearchView.isIconified()) {
        mSearchView.setIconified(true);
    } else {
        super.onBackPressed();
    }
}

答案 2 :(得分:0)

searchView应该是全局变量,然后你需要在onQueryTextSubmit方法

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


    MenuItem searchMenuItem = menu.findItem(R.id.app_bar_search);


    if (searchMenuItem != null) {
        searchView = (SearchView) searchMenuItem.getActionView();
        searchView.setFocusable(true);
        searchView.setQueryHint("Ara...");
        searchView.requestFocusFromTouch();
    }

    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String s) {
            searchView.clearFocus();
            return false;
        }

        @Override
        public boolean onQueryTextChange(String s) {
            adapter.getFilter().filter(s);
            return true;
        }
    });


    return super.onCreateOptionsMenu(menu);
}

然后onBackPressed方法

@Override
public void onBackPressed() {

    if (!searchView.isIconified() && searchView != null) {
        searchView.setIconified(true);
        searchView.onActionViewCollapsed();
    } else {
        super.onBackPressed();
    }

}

答案 3 :(得分:0)

经过几个小时的尝试,我发现了。
我正在使用支持库小部件。
用于 SearchView 的setOnCloseListener不再起作用,您应该使用以下代码中的 onQueryTextChange

searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String s) {
                try {
                    listView.setAdapter(new MyAdapter();
                    listView.setVisibility(View.VISIBLE);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                return false;
            }

            @Override
            public boolean onQueryTextChange(String s) {
                listView.setVisibility(View.GONE);
                return false;
            }

        });

onQueryTextChange 负责对搜索编辑文本输入所做的更改。
因此,如果您注意到默认情况下,当您按下SearchView的后退按钮时,它将清除您输入的文本。
后退按钮将触发 onQueryTextChange ,导致您更改了文本,因此,如果将列表视图的可见性设置为GONE,则问题已解决

@Override
            public boolean onQueryTextChange(String s) {
                listView.setVisibility(View.GONE);
                return false;
            }