Android操作栏没有显示溢出

时间:2012-03-16 14:51:28

标签: android overflow android-actionbar

我的应用中有一个包含3个项目的操作栏。

由于空间问题,只能显示2个,所以我希望第一个显示,其余的显示在溢出中。 但实际上只显示前两项,并且没有可检测到的溢出。

以下是相关代码: list_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:id="@+id/menu_insert"
    android:icon="@android:drawable/ic_menu_add"
    android:title="@string/menu_insert" 
    android:showAsAction="ifRoom|withText"/>
<item android:id="@+id/menu_call"
    android:icon="@android:drawable/ic_menu_call"
    android:title="@string/menu_call" 
    android:showAsAction="ifRoom|withText"/>
<item android:id="@+id/menu_agenda"
    android:icon="@android:drawable/ic_menu_agenda"
    android:title="@string/menu_agenda" 
    android:showAsAction="ifRoom|withText"/>
</menu>

Activity.java

public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater mi = getMenuInflater();
    mi.inflate(R.menu.list_menu, menu);
    return true;
}

9 个答案:

答案 0 :(得分:125)

如果您想显示三个点,无论设备菜单按钮如何!然后你可以在你的应用程序类'onCreate方法 -

中调用这个方法
private void makeActionOverflowMenuShown() {
    //devices with hardware menu button (e.g. Samsung Note) don't show action overflow menu
    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) {
        Log.d(TAG, e.getLocalizedMessage());
    }
}

答案 1 :(得分:53)

Action Bar

<强> RES /菜单/ menu.xml文件

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

    <!-- Search / will display always -->
    <item
        android:id="@+id/action_search"
        android:icon="@drawable/ic_action_search"
        android:showAsAction="always"
        android:title="@string/action_search"/>

    <!-- Location Found -->
    <item
        android:id="@+id/action_location_found"
        android:icon="@drawable/ic_action_location_found"
        android:showAsAction="always"
        android:title="@string/action_location_found"/>

    <!-- More -->
    <item
        android:id="@+id/a_More"
        android:icon="@drawable/ic_action_overflow"
        android:showAsAction="always"
        android:title="More">
        <menu>

            <!-- Refresh -->
            <item
                android:id="@+id/action_refresh"
                android:icon="@drawable/ic_action_refresh"
                android:showAsAction="never"
                android:title="@string/action_refresh"/>

            <!-- Help -->
            <item
                android:id="@+id/action_help"
                android:icon="@drawable/ic_action_help"
                android:showAsAction="never"
                android:title="@string/action_help"/>

            <!-- Check updates -->
            <item
                android:id="@+id/action_check_updates"
                android:icon="@drawable/ic_action_refresh"
                android:showAsAction="never"
                android:title="@string/action_check_updates"/>
        </menu>
    </item>

</menu>

<强> MainActivity.java

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.menu, menu);

        return super.onCreateOptionsMenu(menu);
    }

}

下载Action Bar Icon Set

答案 2 :(得分:42)

我意识到这不是溢出菜单,但它是类似的。 好的,这很简单,但很难弄清楚。

首先需要一个要用作溢出inflater的菜单项。实施例

<item
        android:id="@+id/a_More"
        android:icon="@drawable/more"
        android:showAsAction="always"
        android:title="More">
        </item>

获得商品后,在溢出菜单中添加包含所需商品的子菜单。例如:

<item
    android:id="@+id/a_More"
    android:icon="@drawable/more"
    android:showAsAction="always"
    android:title="More">
    <menu>
        <item
            android:id="@+id/aM_Home"
            android:icon="@drawable/home"
            android:title="Home"/>
    </menu>
</item>

点击此按钮会使其中的其他项目膨胀。我的应用程序正在使用ActionBarSherlock 4.0,因此在此之前,您将需要访问&#34; SplitActionBar&#34;。 (仍然适用于默认的android Actionbar)

在这里&#39>如何: 在AndroidManifest.xml文件中,您需要在需要溢出菜单的活动下添加此代码。

android:uiOptions="splitActionBarWhenNarrow"

注意:您的溢出菜单膨胀的项目必须showAsAction="always"

Vwola!你有一个溢出菜单!希望我能帮助你。 :)

答案 3 :(得分:26)

在带有硬件菜单按钮的设备(Galaxy S3,三星顽固......)上,溢出菜单就像“传统”菜单一样,使用硬件菜单按钮。

答案 4 :(得分:5)

当你说“溢出”菜单时,你的意思是最后显示的三个点表示还有更多的项......或者你的意思是底部显示的溢出项目的分割操作栏?

如果您指的是拆分操作栏,则应将其添加到活动的清单文件

android:uiOptions="splitActionBarWhenNarrow"

默认情况下,三个点溢出菜单应该自动发生,因此很难从上面提供的信息中找出问题所在。

答案 5 :(得分:5)

总是在actionbarcompat上显示动作溢出(三点):
在菜单文件中,例如:
main.xml中

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

    <item
        android:id="@+id/action_settings"
        android:title="@string/action_settings"
        app:showAsAction="never"/>
    <item
        android:id="@+id/action_about"
        android:title="@string/action_about"
        app:showAsAction="never"/>

</menu>

并在活动文件中:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main, menu);
    return super.onCreateOptionsMenu(menu);
}

这对我来说很好。
在谷歌Nexus S,三星S3上测试。

答案 6 :(得分:3)

在带有菜单按钮的设备上,溢出菜单似乎没有显示在ActionBar中。此外,我们无法知道设备是否在 API level 14(4.0+)之前有一个硬件菜单按钮

此解决方案向android.support.v7.app.ActionBar添加一个溢出按钮,该按钮仅在预蜂窝(&lt; 3.0)上打开标准选项菜单,否则将其留给系统。在任何情况下,您都可以在alwaysifRoom之间为所有操作选择。

Action Bar Icon Pack获取溢出图标。

添加一个菜单(我将一些不相关的部分作为标题,订购等)。

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

<item
    android:id="@+id/action_overflow"
    android:orderInCategory="100"
    android:icon="@drawable/ic_action_overflow"
    app:showAsAction="always" />

<item
    android:id="@+id/action_first"
    app:showAsAction="always" />

<item
    android:id="@+id/action_second"
    app:showAsAction="ifRoom" />

</menu>

删除3.0 +上的溢出操作

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        menu.removeItem(R.id.action_overflow);
    }
    return super.onPrepareOptionsMenu(menu);
}

最后从溢出操作中调用Activity.openOptionsMenu()

呃......不。你不能从菜单按钮调用openOptionsMenu() ...但如果你使用AndroidAnnotations,你就可以轻松完成:

@OptionsItem
void action_overflow() {
    openOptionsMenuDeferred();
}

@UiThread
void openOptionsMenuDeferred() {
    openOptionsMenu();
}

如果不是,你应该做这样的事情,我想

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == id.action_overflow) {
        openOptionsMenuDeferred();
        return true;
    }
}

private Handler handler = new Handler(Looper.getMainLooper());
public void openOptionsMenuDeferred() {
    handler.post(new Runnable() {
        @Override
        public void run() {
            openOptionsMenu();
        }
    }
    );
}

答案 7 :(得分:2)

xmlns:your_app_name="http://schemas.android.com/apk/res-auto"放在菜单标记内 而是android:showAsAction="always"使用your_app_name:showAsAction="always"

例如

<item
    android:id="@+id/action_search"
    android:icon="@drawable/icon_search"
    android:title="@string/search"
    your_app_name:showAsAction="ifRoom"/>

答案 8 :(得分:2)

尝试更改应用的主题 Theme.AppCompat.Light.DarkActionBar到Theme.AppCompat.Light