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)
4

4 回答 4

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>
于 2013-01-01T18:55:23.923 回答
12

一个小更新:

  • Jake Wharton 目前正在dev分支中开发 ActionBarSherlock 4.2.0,并已向后SearchView移植到那里。它的功能有限(最值得注意的是 - 不支持SearchableInfo)。但他正在努力扩展功能。

  • 我不知道 Jake Wharton 对反向移植的意图SearchView并做了我的反向移植版本(可以在 github 上找到:abs-search-view)。我的版本也不支持SearchableInfo

这两种实现方式大多相同。他们使用的大部分代码都取自 AOSP。但也有一些显着的差异。

  • ActionBarSherlock backport 支持建议适配器
  • ActionBarSherlock backport 不会回退到SearchView具有 API 11 及更高版本的系统上的原始实现(即,在所有平台上都是相同的代码,具有优缺点)。
  • 我的版本不支持建议适配器(虽然可以添加)。
  • 我的版本在 API 11 之前的系统(使用反向移植版本的代码)和 API 11 及更高版本的系统上功能有限,所有功能都回退到原始本机版本,SearchView并且所有功能都以文档中描述的方式得到支持。

就个人而言,我建议坚持使用 ActionBarSherlock 版本(这样更容易)。并且仅当您在具有 API 11 及更高版本的系统上需要这种全功能行为时才使用我的库。

于 2012-08-05T11:27:03.860 回答
11

不幸的是,根据我的阅读和尝试,ActionBarSherlock 不支持 SearchView 小部件。

Android 将在未来发布一个向后兼容的包来支持这一点,但谁知道那会是什么时候。

看到这个人自己的链接: https ://github.com/JakeWharton/ActionBarSherlock/issues/70

于 2012-01-25T06:44:25.463 回答
4

我遇到了类似的问题,所以我创建了一个自定义 SearchView。也许您想在https://github.com/benjaminmock/MenuItemSearchAction上查看

于 2012-07-04T16:50:09.700 回答