4

我在操作栏中有五个操作菜单项,我正在使用操作栏 sherlock 库,如下所示:

onCreateOptionsMenu(),我使用了以下代码:

  menu.add(0,1,0 "Settings")
      .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);

  menu.add(0,2,0 "Favorites")
      .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);

  menu.add(0,3,0 "List")
      .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);

  menu.add(0,4,0 "Upload")
      .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);

  menu.add(0,5,0 "Search")
     .setActionView(R.layout.search_layout)
     .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);

现在我的问题是搜索编辑文本(红色)如下所示: 搜索编辑文本显示如下

我想在操作栏中显示完整视图,如下所示:

预期产出

4

1 回答 1

6

这个问题有点老了,但无论如何我都会尝试回答。我希望有人会发现它有用。

这是我所做的:

创建一个扩展 SearchView 的自定义 SearchView 类。它定义了 2 个事件:一个在搜索视图展开时触发,另一个在折叠时触发。

public class EnglishVerbSearchView extends SearchView {

OnSearchViewCollapsedEventListener mSearchViewCollapsedEventListener;
OnSearchViewExpandedEventListener mOnSearchViewExpandedEventListener;

public EnglishVerbSearchView(Context context) {
    super(context);
}

@Override
public void onActionViewCollapsed() {
    if (mSearchViewCollapsedEventListener != null)
        mSearchViewCollapsedEventListener.onSearchViewCollapsed();
    super.onActionViewCollapsed();
}

@Override
public void onActionViewExpanded() {
    if (mOnSearchViewExpandedEventListener != null)
        mOnSearchViewExpandedEventListener.onSearchViewExpanded();
    super.onActionViewExpanded();
}

public interface OnSearchViewCollapsedEventListener {
    public void onSearchViewCollapsed();
}

public interface OnSearchViewExpandedEventListener {
    public void onSearchViewExpanded();
}

public void setOnSearchViewCollapsedEventListener(OnSearchViewCollapsedEventListener eventListener) {
    mSearchViewCollapsedEventListener = eventListener;
}

public void setOnSearchViewExpandedEventListener(OnSearchViewExpandedEventListener eventListener) {
    mOnSearchViewExpandedEventListener = eventListener;
}

}

在我的活动中,我做了以下事情: - 创建了一个私有字段来存储对菜单的引用。- 定义了折叠和展开搜索视图的事件,我通过使用对菜单的引用来隐藏和显示其他操作。

public class DictionaryActivity extends ActionBarActivity {

    private Menu mMenu;

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.dictionary, menu);

    MenuItem searchItem = menu.findItem(R.id.action_search);
    EnglishVerbSearchView searchView = (EnglishVerbSearchView) MenuItemCompat.getActionView(searchItem);        

    searchView.setOnSearchViewCollapsedEventListener(listenerCollapse);
    searchView.setOnSearchViewExpandedEventListener(listenerExpand);

    mMenu = menu;

    return super.onCreateOptionsMenu(menu);
}

final private OnSearchViewCollapsedEventListener listenerCollapse = new OnSearchViewCollapsedEventListener() {

    @Override
    public void onSearchViewCollapsed() {
        // show other actions
        MenuItem favouriteItem = mMenu.findItem(R.id.action_favourite);
        MenuItem playItem = mMenu.findItem(R.id.action_play);
        favouriteItem.setVisible(true);
        playItem.setVisible(true);

        // I'm doing my actual search here          
    }
};

final private OnSearchViewExpandedEventListener listenerExpand = new OnSearchViewExpandedEventListener() {

    @Override
    public void onSearchViewExpanded() {
        // hide other actions
        MenuItem favouriteItem = mMenu.findItem(R.id.action_favourite);
        MenuItem playItem = mMenu.findItem(R.id.action_play);
        favouriteItem.setVisible(false);
        playItem.setVisible(false);
    }
};

}

在 menu.xml 文件中,我使用了自定义搜索视图:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:yourapp="http://schemas.android.com/apk/res-auto" >
<item android:id="@+id/action_search"
      android:title="@string/action_search"
      android:icon="@drawable/action_search"
      yourapp:showAsAction="always|collapseActionView"
      yourapp:actionViewClass="com.xxx.EnglishVerbSearchView" />
</menu>

我希望这是所有需要的,因为它只是我完整的活动代码的摘录。让我知道是否缺少任何东西。


根据 arne.jans 的评论:

这似乎足以MenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);SearchView. 优点是:其他菜单项进入溢出菜单并且仍然可以访问,即使打开了SearchView.

于 2013-09-06T02:00:15.827 回答