Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/204.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何使用abs将搜索菜单项设置为操作栏中的完整视图_Android_Action_Android Actionbar_Actionbarsherlock - Fatal编程技术网

Android 如何使用abs将搜索菜单项设置为操作栏中的完整视图

Android 如何使用abs将搜索菜单项设置为操作栏中的完整视图,android,action,android-actionbar,actionbarsherlock,Android,Action,Android Actionbar,Actionbarsherlock,我在action bar中有五个action菜单项,我正在使用action bar sherlock库,如下所示: 在onCreateOptions菜单()中,我使用了以下代码: menu.add(0,1,0 "Settings") .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); menu.add(0,2,0 "Favorites") .setShowAsAction(MenuItem.SHOW_AS_ACTI

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

onCreateOptions菜单()
中,我使用了以下代码:

  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);
现在我的问题是搜索编辑文本(红色)如下所示:

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


这个问题有点老了,但我还是会尽力回答的。我希望有人会觉得它有用

以下是我所做的:

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

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
,也仍然可以访问

您正在将其他项目设置为“始终显示为操作”,显然没有足够的空间用于可折叠的搜索项目。谢谢!请注意:似乎只需执行MenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM)就足够了;为SearchView腾出空间。这样做的好处是:其他菜单项进入溢出菜单,即使打开SearchView,仍然可以访问。@arne.jans谢谢!我将其添加到我的答案中,感谢您对其进行了改进。如果我使用您的方法,该应用程序将崩溃,NPE将在运行Android 4.0-4.1.2的特定设备上访问activity.onCreateOptions菜单中的null searchView。你也有这个问题吗?就在这个NPE之前,日志显示以下异常作为警告(这很奇怪,因为我肯定有正确的带参数上下文的公共构造函数):java.lang.reflect.InvocationTargetException位于java.lang.reflect.constructor.constructNative(本机方法)位于java.lang.reflect.constructor.newInstance(constructor.java:417)@不,我没有这个问题。我在我的应用程序中使用了这种方法,并且没有崩溃报告。也许你可以用你的代码创建一个单独的问题。我发现如果我以后不调用SupportInvalidateOptions功能表,它就可以正常工作,再次感谢!