Android操作栏没有显示溢出

Mat*_*men 90 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>
Run Code Online (Sandbox Code Playgroud)

Activity.java

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

Atu*_*hik 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());
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这是一个糟糕的黑客攻击,破坏了与平台上其他应用程序的一致性.不要这样做. (32认同)
  • 这似乎是两个邪恶中较小的一个.目前的行为是不可接受的. (19认同)
  • 这是允许溢出的好方法,不再容忍菜单硬键. (6认同)
  • 它很棒!即使用户按下硬件菜单按钮(这很棒),也可以工作,虽然你会听到两次菜单声音效果..有没有人知道如何只发出一次声音? (5认同)
  • 这不是一个黑客.开发者需要知道什么叫黑客,因为它在Android中不是2 + 2.反射是使用Java机制节省时间,否则您将24/7将上下文传递给内部类,或者将AOSP自定义为无穷大.对我来说,这个解决方案解决了必须覆盖并包含大量AOSP自定义内容和链接的私人关联的问题,仅仅是为了纯粹主义者认为干净.您是否知道无法为小型列表强制启用FASTSCROLL?在我使用反射之前,这需要我复制10个以上的AOSP资源,用于ONE char编辑. (5认同)

Kir*_*ela 54

行动吧

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>
Run Code Online (Sandbox Code Playgroud)

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);
    }

}
Run Code Online (Sandbox Code Playgroud)

下载操作栏图标集

  • 看看@Reinier评论,这是真的"如果你的设备有一个菜单按钮,溢出图标将不显示". (2认同)

Lev*_*8er 42

我意识到这不是溢出菜单,但它是类似的.好的,这很简单,但很难弄明白.

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

<item
        android:id="@+id/a_More"
        android:icon="@drawable/more"
        android:showAsAction="always"
        android:title="More">
        </item>
Run Code Online (Sandbox Code Playgroud)

获得项目后,在溢出菜单中添加包含所需项目的子菜单.例:

<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>
Run Code Online (Sandbox Code Playgroud)

点击这将膨胀其他项目.我的应用程序正在使用ActionBarSherlock 4.0,因此在此之前,您将需要访问"SplitActionBar".(仍将在默认的android Actionbar上工作)

方法如下:在AndroidManifest.xml文件中,您需要在需要溢出菜单的活动下添加此代码.

android:uiOptions="splitActionBarWhenNarrow"
Run Code Online (Sandbox Code Playgroud)

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

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

  • 很好的解决方案,比菜单按钮黑客更好. (3认同)

Luk*_*eau 26

在具有硬件菜单按钮的设备(Galaxy S3,三星顽固......)上,溢出菜单表现为"传统"菜单,使用硬件菜单按钮.

  • 旧的答案,但兼容库只是偶然发现奇怪的结果:3个设备带硬件按钮,注3 Neo =溢出菜单显示,菜单按钮不起作用,注1 =无溢出,菜单按钮工作,Galaxy S3,否溢出,菜单按钮不起作用!这太疯狂了. (2认同)

wna*_*fee 5

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

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

android:uiOptions="splitActionBarWhenNarrow"
Run Code Online (Sandbox Code Playgroud)

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

  • 您的设备是否有用于菜单的物理按钮,还是像galaxy nexus手机这样的虚拟按钮?我认为如果你的手机没有物理按钮,三个点只会出现. (5认同)

MrS*_*iro 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>
Run Code Online (Sandbox Code Playgroud)

并在活动文件中:

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

它对我来说很好.
在三星S3的谷歌Nexus S上测试过.