【问题标题】:Reset Search in SearchView when you click on back单击返回时重置 SearchView 中的搜索
【发布时间】:2014-05-24 10:28:43
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

    searchMenuItem.setOnActionExpandListener(new MenuItem.OnActionExpandListener() {
    
            @Override
            public boolean onMenuItemActionExpand(MenuItem item) {
                return true;
            }
    
            @Override
            public boolean onMenuItemActionCollapse(MenuItem item) {
                refreshSearch("");
                return true;
            }
        });
    

    【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 您好,感谢您的回复。这甚至不起作用:( ...第一次返回将隐藏键盘,第二次单击将折叠搜索并失去焦点搜索(我想在这里重置我的列表)......在第三次返回单击您的事件将被引发但不是在第二个后面......我会添加一些额外的代码块,这可能会有所帮助
    【解决方案3】:

    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();
        }
    
    }
    

    【讨论】:

      【解决方案4】:

      经过几个小时的尝试,我想通了。
      我正在使用支持库小部件。
      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;
                  }
      

      【讨论】:

        猜你喜欢
        • 2012-12-15
        • 1970-01-01
        • 1970-01-01
        • 2012-10-20
        • 1970-01-01
        • 2016-07-03
        • 1970-01-01
        • 2021-06-15
        • 2014-08-11
        相关资源
        最近更新 更多