如何在上下文操作栏中创建"搜索"字段?

Jus*_*ain 5 android android-actionbar contextual-action-bar

我有一个ActionBar的活动.其中一个选项是搜索文档(不一定是本地文档).我想使用具有以下项目的上下文操作栏(CAB):

  • 编辑字段 - 用户输入要搜索的文本的位置
  • 上一个按钮 - 移动到与搜索匹配的上一个项目
  • 下一个按钮 - 移动到与搜索匹配的下一个项目

我想使用CAB有几个原因.首先,我希望用户选择一个选项,该选项将调出上面定义的CAB.当用户完成搜索时,他们选择完成按钮,ActionBar返回到先前状态.

这是问题所在.我无法让搜索项在扩展状态下显示在我的CAB中.注意:我尝试修改的活动不是主要活动,而是用户根据特定事件启动的活动.加载此活动后,用户可能会也可能不会决定使用我正在描述的"搜索"功能.我也不希望Android进行搜索.我有一个API,可以搜索我想要的结果,并允许我导航到上一个/下一个搜索结果.

我的CAB代码(正确调用)是:

     protected ActionMode mActionModeSearch;
private ActionMode.Callback mActionModeSearchCallback = new ActionMode.Callback()
{
    @Override
    public boolean onCreateActionMode(ActionMode actionMode, Menu menu)
    {
        actionMode.getMenuInflater().inflate(R.menu.pdf_menu_search, menu);
        // Associate searchable configuration with the SearchView
        SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        SearchView searchView = (SearchView) menu.findItem(R.id.pdf_menu_search_item).getActionView();
        searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
        searchView.setIconifiedByDefault(false);
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener()
        {
            @Override
            public boolean onQueryTextSubmit(String s)
            {
                return false;
            }

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

    @Override
    public boolean onPrepareActionMode(ActionMode actionMode, Menu menu)
    {
        return false;
    }

    @Override
    public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem)
    {
        switch(menuItem.getItemId())
        {
            case R.id.pdf_menu_search_prev:
                findPrevSearchResult();
                return true;
            case R.id.pdf_menu_search_next:
                findNextSearchResult();
                return true;
            default:
                return false;
        }
    }

    @Override
    public void onDestroyActionMode(ActionMode actionMode)
    {
        //resetHideToolbarsTimer();
    }
};
Run Code Online (Sandbox Code Playgroud)

CAB菜单代码是:

 <?xml version="1.0" encoding="utf-8"?>
 <menu xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto">
<group android:id="@+id/group_search_mode">
    <item
        android:id="@+id/pdf_menu_search_item"
        android:title="@string/search"
        android:icon="@drawable/ic_pdf_action_search"
        app:showAsAction="collapseActionView|ifRoom"
        app:actionViewClass="android.support.v7.widget.SearchView"/>
    <item
        android:id="@+id/pdf_menu_search_prev"
        android:title="@string/search_prev"
        android:icon="@drawable/ic_pdf_action_search_prev"
        app:showAsAction="ifRoom" />
    <item
        android:id="@+id/pdf_menu_search_next"
        android:title="@string/search_next"
        android:icon="@drawable/ic_pdf_action_search_next"
        app:showAsAction="ifRoom" />
</group>
Run Code Online (Sandbox Code Playgroud)

我还在AndroidManifest.xml中更改了我的活动定义,虽然我不确定这是否是必需的:

         <activity
        android:name="com.myapp.myActivity"
        android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.SEARCH" />
        </intent-filter>
        <meta-data
            android:name="android.app.default_searchable"
            android:value="com.myapp.myActivity" />
        <meta-data
            android:name="android.app.searchable"
            android:resource="@xml/searchable" />
    </activity>
Run Code Online (Sandbox Code Playgroud)

当我运行应用程序时,活动正确加载.当用户选择搜索选项时,我加载CAB,它似乎运行正常.我已逐步完成代码以确保onCreateActionMode按预期运行.但是,我所看到的只是搜索的图标,下一个和上一个,使用"完成"按钮.当我触摸"搜索"图标时,它什么也没做.在CAB中没有创建文本字段供我输入文本.我究竟做错了什么????

显示CAB即将到来的屏幕截图.如您所见,搜索图标显示但在我按下时没有做任何事情.我真正需要的是默认情况下显示搜索编辑框.

在此输入图像描述

era*_*tin 10

首先,我们应该alwaysapp:showAsAction所有菜单项设置值:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto">
    <group android:id="@+id/group_search_mode">
        <item
            android:id="@+id/pdf_menu_search_item"
            android:icon="@drawable/ic_pdf_action_search"
            android:title="@string/search"
            app:actionViewClass="android.support.v7.widget.SearchView"
            app:showAsAction="always"/>
        <item
            android:id="@+id/pdf_menu_search_prev"
            android:icon="@drawable/ic_pdf_action_search_prev"
            android:title="@string/search_prev"
            app:showAsAction="always"/>
        <item
            android:id="@+id/pdf_menu_search_next"
            android:icon="@drawable/ic_pdf_action_search_next"
            android:title="@string/search_next"
            app:showAsAction="always"/>
    </group>
</menu>
Run Code Online (Sandbox Code Playgroud)

次要的,在这种情况下,我们不需要为我们的Activity可搜索信息设置意图过滤器SearchView.

此活动的定义AndroidManifest.xml:

<activity
    android:name="com.myapp.myActivity"
    android:label="@string/app_name" />
Run Code Online (Sandbox Code Playgroud)

ActionMode.Callback 执行:

private ActionMode.Callback mActionModeSearchCallback = new ActionMode.Callback() {

    private SearchView mSearchView;

    @Override
    public boolean onCreateActionMode(ActionMode actionMode, Menu menu) {
        actionMode.getMenuInflater().inflate(R.menu.home, menu);
        mSearchView = (SearchView) MenuItemCompat.getActionView(menu.findItem(R.id.pdf_menu_search_item));
        mSearchView.setIconifiedByDefault(false);
        mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String s) {
                return false;
            }

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

    @Override
    public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) {
        mSearchView.requestFocus();
        return true;
    }

    @Override
    public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {
        switch (menuItem.getItemId()) {
            case R.id.pdf_menu_search_prev:
                findPrevSearchResult();
                return true;
            case R.id.pdf_menu_search_next:
                findNextSearchResult();
                return true;
            default:
                return false;
        }
    }

    @Override
    public void onDestroyActionMode(ActionMode actionMode) {

    }
};
Run Code Online (Sandbox Code Playgroud)

我刚刚在三个4.0+设备上尝试了这个代码,它完全正常工作.但我没有测试较低操作系统版本的设备.

希望它对你有所帮助.