【问题标题】:Using native look and feel of the searchView for actionBarSherlock on old Android versions在旧 Android 版本上为 actionBarSherlock 使用 searchView 的原生外观
【发布时间】:2012-09-09 13:37:27
【问题描述】:

我注意到没有有效的解决方案显示如何使用操作栏对 listView 项目使用过滤器,该解决方案适用于较旧的 Android 版本(如 2.3.x)。

我发现的唯一示例是在片段示例的文件“LoaderCursorSupport.java”中。但是,只有在可以创建searchView的情况下才有效,即从Android 3.x开始,如代码所示:

View searchView=SearchViewCompat.newSearchView(getActivity());
if(searchView!=null)
...    

即使在 actionBarSherlock 的version 4.2 上,上述错误(或缺失的功能,无论你怎么看)仍然存在。

所以我制作了自己的解决方案,效果很好(我希望官方库也可以添加我的修复),但我不知道在哪里可以找到 editText 视图中的“x”按钮负责清除文本。

谁能告诉我如何获得本机外观并将其正确放入代码中?

这是我正在谈论的截图:

对于那些希望使用此功能的人,这是我的代码 sn-p :

@Override
public boolean onCreateOptionsMenu(final com.actionbarsherlock.view.Menu menu)
  {
  getSupportMenuInflater().inflate(R.menu.activity_main,menu);
  _searchMenuItem=menu.findItem(R.id.menu_item_action_search);
  View searchView=SearchViewCompat.newSearchView(this);
  if(searchView!=null)
    SearchViewCompat.setOnQueryTextListener(searchView,new OnQueryTextListenerCompat()
      {
        @Override
        public boolean onQueryTextChange(final String newText)
          {
          _listAdapter.getFilter().filter(newText);
          return true;
          }

        @Override
        public boolean onQueryTextSubmit(final String query)
          {
          return super.onQueryTextSubmit(query);
          }
      });
  else
    {
    searchView=new EditText(this);
    searchView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT));
    ((EditText)searchView).setHint(R.string.search);
    ((EditText)searchView).addTextChangedListener(new TextWatcher()
      {
        String curretTextToFilter =null;

        @Override
        public void onTextChanged(final CharSequence newText,final int start,final int before,final int count)
          {
          if(newText==curretTextToFilter)
            return;
          curretTextToFilter=newText.toString();
          _listAdapter.getFilter().filter(curretTextToFilter==null||curretTextToFilter.length()==0 ? null : curretTextToFilter);
          }

        @Override
        public void beforeTextChanged(final CharSequence s,final int start,final int count,final int after)
          {}

        @Override
        public void afterTextChanged(final Editable s)
          {}
      });
    }
  final View finalSearchView=searchView;
  _searchMenuItem.setOnActionExpandListener(new OnActionExpandListener()
    {
      @Override
      public boolean onMenuItemActionExpand(final MenuItem item)
        {
        if(finalSearchView instanceof EditText)
          {
          final InputMethodManager m=(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
          finalSearchView.requestFocus();
          if(m!=null)
            m.toggleSoftInput(0,InputMethodManager.SHOW_IMPLICIT);
          }
        return true;
        }

      @Override
      public boolean onMenuItemActionCollapse(final MenuItem item)
        {
        if(finalSearchView instanceof EditText)
          ((EditText)finalSearchView).setText(null);
        else _listAdapter.getFilter().filter(null);
        return true;
        }
    });
  _searchMenuItem.setActionView(searchView);
  //
  return true;
  }

@Override
public boolean onKeyUp(final int keyCode,final KeyEvent event)
  {
  if(keyCode==KeyEvent.KEYCODE_SEARCH)
    {
    _searchMenuItem.expandActionView();
    return true;
    }
  return super.onKeyUp(keyCode,event);
  }

【问题讨论】:

  • dev 分支有SearchView
  • 但我已经尝试过了,但它在 2.3.x 版本的模拟器上不起作用 - 按下搜索操作项没有任何作用。不是我提到的最新的开发版本 4.2 吗?
  • @JakeWharton 我认为他们已经更新了它,因为我已经尝试过了。现在它可以工作了,但它仍然不允许具有相同的样式(和 X 按钮)。

标签: android filtering actionbarsherlock searchview


【解决方案1】:

除了“X”按钮,我认为其余的都可以使用带有主题的库来完成,名为HoloEverywhere

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-20
    • 1970-01-01
    • 1970-01-01
    • 2013-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多