2014-10-16 136 views
4

我有一个ActionBar的活动。其中一个选项是搜索文档(不一定是本地)。我想用一个上下文操作栏(CAB)与下列项目:如何在上下文操作栏中创建“搜索”字段?

  • 编辑字段 - 地方,用户可以输入要搜索的
  • 上一页按钮文本 - 移动到匹配的上一个项目搜索
  • 下一个按钮 - 移动到匹配搜索

我想用一个CAB有以下几个原因的下一个项目。主要是,我希望用户选择一个可以调出上面定义的CAB的选项。当用户完成搜索时,他们选择完成按钮,并且ActionBar返回到之前的状态。

这是问题所在。我无法让搜索项以扩展状态出现在我的CAB中。注:我试图修改的活动不是主要活动,而是用户基于某些事件启动的活动。加载此活动后,用户可能决定或不会决定使用我所描述的“搜索”功能。我也不希望Android进行搜索。我有一个API将搜索我想要的结果,并允许我导航到prev/next搜索结果。

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

的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> 

我也改变了我的活动定义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> 

当我运行该应用程序时,该活动正确加载。当用户选择搜索选项时,我加载CAB,它似乎运行良好。我已经通过代码来确保onCreateActionMode按预期运行。但是,我看到的只是搜索的图标,下一个和上一个,用'完成'按钮。当我触摸“搜索”图标时,它不会执行任何操作。在CAB中没有创建文本字段供我输入文本。我究竟做错了什么????

屏幕截图显示CAB即将推出。正如你所看到的,当我按下它时,搜索图标会显示但不会做任何事情。我真正需要的是搜索编辑框默认显示。

enter image description here

回答

9

首先,我们应该为所有菜单项的设置app:showAsActionalways

<?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> 

次要,在这种情况下,我们并不需要为我们的Activity设置意图过滤器,并为我们的SearchView搜索信息。在AndroidManifest.xml这个活动的

定义:

<activity 
    android:name="com.myapp.myActivity" 
    android:label="@string/app_name" /> 

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

    } 
}; 

我只是想在三个4.0+设备此代码,它完全工作。但我没有在较低版本的操作系统上测试。

希望它对您有所帮助。

+0

真棒!我尝试了几乎所有的答案,但总是错过了一件事。你把它放在一起。谢谢!!!! – JustLearningAgain 2014-10-21 15:11:05

+0

这不低于4.0。 – Colateral 2016-11-10 21:38:25

2

我有问题搜索查看的CAB ,所以我设置的布局(与EditText上)在马努项目,它给我相同的看法搜索查看 试试这个,我希望它为你工作

菜单/ search.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android" > 

    <item 
     android:id="@+id/edt_mySearch" 
     android:actionLayout="@layout/search_bar" 
     android:enabled="true" 
     android:showAsAction="always" 
     android:visible="true"/> 

</menu> 

layout/search _bar。XML

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    > 


    <EditText 
     android:layout_alignParentLeft="true" 
     android:id="@+id/edt_search" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:hint=" Search..." 
     /> 


</RelativeLayout> 

和myAction模式

mActionModeCallback = new ActionMode.Callback() { 

      @Override 
      public boolean onCreateActionMode(ActionMode mode, Menu menu) { 
       // mode.setTitle("Demo"); 
       getSupportMenuInflater().inflate(R.menu.search, menu); 
       RelativeLayout m = (RelativeLayout) menu.findItem(
         R.id.edt_mySearch).getActionView(); 
       EditText mSearchView = (EditText) m 
         .findViewById(R.id.edt_search); 

       mSearchView.addTextChangedListener(new TextWatcher() { 

        @Override 
        public void onTextChanged(CharSequence s, int start, 
          int before, int count) { 
         // TODO Auto-generated method stub 

        } 

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

        } 

        @Override 
        public void afterTextChanged(Editable s) { 
         // search here 
        } 
       }); 
       return true; 
      } 

      @Override 
      public boolean onPrepareActionMode(ActionMode mode, Menu menu) { 
       // TODO Auto-generated method stub 
       return false; 
      } 

      @Override 
      public boolean onActionItemClicked(ActionMode mode, MenuItem item) { 
       return false; 
      } 

      @Override 
      public void onDestroyActionMode(ActionMode mode) { 
      } 

     }; 
+0

曾尝试此操作并回复 – Lokesh 2014-10-20 11:07:45

+0

您的答案是假设ActionBarSherlock。我正在使用支持。你能否重新考虑这个答案?我喜欢你要走的方向,我试着让它在我们说话的时候运作。 – JustLearningAgain 2014-10-20 15:00:07

+0

我添加了代码:actionMode.getMenuInflator()。inflate(R.menu.search,menu)。然后我尝试获取相关布局。我在search_bar.xml中为布局添加了一个ID:android:id =“@ + id/pdf_search_relative_layout”。然后我调用:RelativeLayout m =(RelativeLayout)menu.findItem(R.id.pdf_search_relative_layout);问题是我为'm'取回null。 – JustLearningAgain 2014-10-20 15:10:15

相关问题