Android操作栏溢出菜单未在纵向模式下显示

时间:2013-12-28 20:55:09

标签: android android-actionbar

我有一个标准的Android操作栏(我没有使用兼容性库)和SearchView以及一些纯文本菜单项。我想让SearchView始终展开,溢出菜单中的其余项目。到目前为止我的代码在平板电脑和横向模式下的Nexus 5上工作正常,但是当手机处于纵向模式时,不会显示溢出菜单。如果我将collapseActionView属性添加到SearchView,则会正确显示溢出菜单,但我希望将搜索小部件完全展开。

以下是我的选项菜单的XML:

<menu xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:id="@+id/menu_search"
          android:icon="@android:drawable/ic_menu_search"
          android:title="@string/search"
          android:showAsAction="ifRoom"
          android:actionViewClass="android.widget.SearchView" />
    <item android:id="@+id/action_clear_history"
          android:title="@string/action_clear_history"
          android:showAsAction="never"/>
    <item android:id="@+id/action_feedback"
          android:title="@string/action_feedback"
          android:showAsAction="never"/>
    <item android:id="@+id/action_about"
          android:title="@string/action_about"
          android:showAsAction="never"/>
</menu>

这是我的onCreateOptionsMenu代码:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    if (!mNavigationDrawerFragment.isDrawerOpen()) {
        getMenuInflater().inflate(R.menu.options_menu, menu);
        SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();
        searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
        searchView.setIconifiedByDefault(false);
        restoreActionBar();
        return true;
    }
    return super.onCreateOptionsMenu(menu);
}

以下是横向模式的屏幕截图,按预期工作:

Landscape mode

这是肖像模式,缺少溢出菜单:

Portrait mode

有人能指出我正确的方向吗?

3 个答案:

答案 0 :(得分:1)

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/menu_search"
          android:icon="@android:drawable/ic_menu_search"
          android:title="@string/search"
          android:showAsAction="ifRoom"
          android:actionViewClass="android.widget.SearchView"/>
    <item
          android:id="@+id/menu_item_more"
          android:icon="@drawable/ic_overflow"
          android:showAsAction="always"
          android:title="CLICK FOR MORE OPTIONS">
        <menu>
            <item android:id="@+id/action_clear_history"
                  android:title="@string/action_clear_history"
                  android:showAsAction="never"/>
            <item android:id="@+id/action_feedback"
                  android:title="@string/action_feedback"
                  android:showAsAction="never"/>
            <item android:id="@+id/action_about"
                  android:title="@string/action_about"
                  android:showAsAction="never"/>
        </menu>
    </item>    
</menu>

我添加了一个item,其中包含对溢出子菜单的引用,如果需要,可以尝试这个,或者可以对此提出疑问。并且ic_overflow图标可以是THIS

答案 1 :(得分:0)

我有类似的问题,很有用我发现这是:SearchView taking all the space in the new ActionBarCompat,因此解决方案是从代码中手动添加SearchView,而不是从菜单布局中添加。

这里有一些我在api 19上成功使用的代码,带有支持操作栏的片段:

public void initSearchView() {
    searchView = new SearchView(getActionBarHelper().getThemedContext());
    searchView.setIconifiedByDefault(false);

    ActionBar.LayoutParams layoutParams = new ActionBar.LayoutParams(
        ActionBar.LayoutParams.MATCH_PARENT,
        ActionBar.LayoutParams.WRAP_CONTENT, Gravity.RIGHT
        | Gravity.CENTER_VERTICAL);
    searchView.setLayoutParams(layoutParams);

   getActionBarHelper().setCustomView(searchView);
   getActionBarHelper().setDisplayShowCustomEnabled(true);

   searchView.setOnQueryTextListener(mOnQueryTextListener);
   searchView.clearFocus();
   searchView.setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI);
}

  protected ActionBar getActionBarHelper() {
    return ((ActivityBase) getActivity()).getSupportActionBar();
  }

我在onCreateView()中调用initSearchView,

答案 2 :(得分:-1)

try {
    ViewConfiguration config = ViewConfiguration.get(this);
    Field menuKeyField = ViewConfiguration.class
            .getDeclaredField("sHasPermanentMenuKey");
    if (menuKeyField != null) {
        menuKeyField.setAccessible(true);
        menuKeyField.setBoolean(config, false);
    }
} catch (Exception e) {
    e.printStackTrace();
}