安卓ActionBarSherlock搜索视图

19

我们能否在Android 2.2中使用ActionBarSherlock实现SeachView。

我正在使用以下代码,在3.0中运行良好,但在2.2中无法正常工作。

 @Override
public boolean onCreateOptionsMenu(Menu menu) {
    //getMenuInflater().inflate(R.menu.main_menu, menu);
     MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.main_menu, menu);
    // set up a listener for the refresh item


        SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();
        final SearchView.OnQueryTextListener queryTextListener = new    SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextChange(String newText) {
                // Do something
                System.out.println("onQueryTextChange----------");
                return true;
            }
            @Override
            public boolean onQueryTextSubmit(String query) {
                // Do something
                System.out.println("onQueryTextSubmit----------");
                return true;
            }
        };
        searchView.setOnQueryTextListener(queryTextListener);

   return true;
     }

我在2.2版本中遇到了以下错误

    at 01-23 17:31:53.230: W/MenuInflater(20214):   at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
01-23 17:31:53.230: W/MenuInflater(20214):  at com.actionbarsherlock.internal.view.menu.MenuInflaterImpl$MenuState.newInstance(MenuInflaterImpl.java:533)
01-23 17:31:53.230: W/MenuInflater(20214):  at com.actionbarsherlock.internal.view.menu.MenuInflaterImpl$MenuState.setItem(MenuInflaterImpl.java:497)
01-23 17:31:53.230: W/MenuInflater(20214):  at com.actionbarsherlock.internal.view.menu.MenuInflaterImpl$MenuState.addItem(MenuInflaterImpl.java:515)
01-23 17:31:53.230: W/MenuInflater(20214):  at com.actionbarsherlock.internal.view.menu.MenuInflaterImpl.parseMenu(MenuInflaterImpl.java:238)
01-23 17:31:53.230: W/MenuInflater(20214):  at com.actionbarsherlock.internal.view.menu.MenuInflaterImpl.inflate(MenuInflaterImpl.java:164)
01-23 17:31:53.230: W/MenuInflater(20214):  at com.actionbarsherlock.sample.styledactionbar.MainActivity.onCreateOptionsMenu(MainActivity.java:99)
01-23 17:31:53.230: W/MenuInflater(20214):  at android.support.v4.app.FragmentActivity.dispatchCreateOptionsMenu(FragmentActivity.java:601)
01-23 17:31:53.230: W/MenuInflater(20214):  at android.support.v4.app.FragmentActivity.invalidateOptionsMenu(FragmentActivity.java:706)

请查看此答案(http://stackoverflow.com/questions/14991980/actionbarsherlock-searchview-setonquerytextlistener/15050518#15050518)。我尚未测试它在低于3.0版本的情况下是否有效。 - Dave Agaba
4个回答

12

一个小更新:

  • Jake Wharton正在dev分支上开发ActionBarSherlock 4.2.0,并在那里将SearchView进行了回溯。它的功能有限(最明显的是不支持SearchableInfo),但他正在努力扩展其功能。

  • 我不知道Jake Wharton回溯SearchView的意图,并做了自己的回溯版本(可以在github上找到:abs-search-view)。 我的版本也不支持SearchableInfo

这两个实现方式基本相同。它们使用大量来自AOSP的相同代码。但是有一些明显的区别。

  • ActionBarSherlock回溯支持建议适配器
  • ActionBarSherlock回溯在具有API 11及以上版本的系统上不会回退到原始的SearchView实现(即所有平台都具有优缺点的相同代码)。
  • 我的版本不支持建议适配器(但可以添加)。
  • 我的版本在API 11之前的系统上功能有限(使用回溯版本的代码),而在API 11及更高版本上,所有功能都会回退到原始本地版本的SearchView上,并支持文档中描述的所有功能。

个人建议仍然使用ActionBarSherlock版本(这样更容易)。只有在需要在API 11及更高版本上具有完全功能行为时才使用我的库。


1
SearchableInfo仍然不支持吗?也就是说,无法按照“配置搜索小部件”教程中的步骤进行操作吗?http://developer.android.com/guide/topics/search/search-dialog.html谢谢 - Thomas Clowes
3
截至2012年6月12日,SearchView已在ABS的4.2版本中实现。 - Gaurav Agarwal

12
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
    android:id="@+id/search"
    android:actionLayout="@layout/layout_menu_search"
    android:actionViewClass="com.actionbarsherlock.widget.SearchView"
    android:icon="@drawable/ic_menu_search"
    android:orderInCategory="1"
    android:showAsAction="always|collapseActionView"/>

</menu>

11

另一种选择是根据操作系统版本对搜索视图小部件进行分类。为早期的蜂窝前设备创建自己的搜索视图小部件,并在API-11+中使用默认设置。 - Cookster
6
SearchView 是一个非常先进的小部件。将其移植并不是一件轻松的事情。正如相关问题所述,这可能会在未来发生,但目前它并不是我的优先考虑事项。不过,如果有人愿意为此做出贡献,那就再好不过了... - Jake Wharton
5
SearchView在ABS的4.2版本中得以实现。 - Gaurav Agarwal

4

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