Android 4.3菜单项showAsAction =“always”被忽略

时间:2013-07-28 23:24:12

标签: android menuitem android-support-library android-actionbar-compat

我正在使用从Android 4.3(API级别18)开始提供的新v7 appcompat库。

无论showAsAction中为菜单项指定了什么,它都没有显示 - 它总是创建溢出菜单图标,并在菜单下放置一个菜单项。

尝试将菜单添加到此类活动中:

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

这是我的菜单xml:

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/menu_add_size"
        android:title="@string/menu_add_item"
        android:orderInCategory="10"
        android:showAsAction="always"
        android:icon="@android:drawable/ic_menu_add" />
</menu>

这是新支持库v7的错误,还是代码有问题? 我以前多次使用与ActionBarSherlock类似的代码。

13 个答案:

答案 0 :(得分:309)

可能您缺少必需的命名空间:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:[yourapp]="http://schemas.android.com/apk/res-auto">
    <item android:id="@+id/menu_add_size"
        android:title="@string/menu_add_item"
        android:orderInCategory="10"
        [yourapp]:showAsAction="always"
        android:icon="@android:drawable/ic_menu_add" />
</menu>

[yourapp]替换为您的应用名称或您心所欲望的任何命名空间。

其他值得检查的事情:

  • 查看您的活动类是否延伸ActionBarActivity

检查问题是否仍然存在。


Android参考文档:Adding Action Buttons。以下是相关文字:

  

如果您的应用使用支持库来兼容低至Android 2.1的版本,则android:namespace中不提供showAsAction属性。相反,此属性由支持库提供,您必须定义自己的XML命名空间并将该命名空间用作属性前缀。 (自定义XML命名空间应该基于您的应用程序名称,但它可以是您想要的任何名称,并且只能在您声明它的文件范围内访问。)

答案 1 :(得分:52)

弄清楚自己。使用支持库v7,showAsAction应该在这样的自定义命名空间下:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:balloonberry="http://schemas.android.com/apk/res-auto">
    <item android:id="@+id/menu_add_size"
        android:title="@string/menu_add_item"
        android:orderInCategory="10"
        balloonberry:showAsAction="always"
        android:icon="@android:drawable/ic_menu_add" />
</menu>

答案 2 :(得分:28)

还要确保在ActionBarActivity.onCreateOptionsMenu()方法中使用正确的inflater。

正确的解决方案:

MenuInflater menuInflater = getMenuInflater();
menuInflater.inflate(R.menu.menu_example, menu);

解决方案不正确:

MenuInflater menuInflater = new MenuInflater(this);
menuInflater.inflate(R.menu.menu_example, menu);

答案 3 :(得分:24)

碎片

具有自定义命名空间的菜单将 阻止 showAsAction显示。

使用&#34; android:&#34; showAsAction的前缀将起作用,即使Android Studio会注意到应该使用自定义名称空间。

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/action_add_checkin"
          android:title="Add Checkin"
          android:orderInCategory="10"
          android:showAsAction="always"
        android:icon="@android:drawable/ic_menu_add"/>
</menu>

这是使用Android SDK 22和支持v4片段,以防万一。

答案 4 :(得分:16)

遇到了同样的问题,但是在Android 5上我有3个项目,但操作系统忽略了我的属性“总是”,只显示了2个项目。在这里我的解决方案:

  @Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    Log.d(TAG, "onCreateOptionsMenu()");
    inflater.inflate(R.menu.your_menu, menu);
    for (int j = 0; j < menu.size(); j++) {
        MenuItem item = menu.getItem(j);
        Log.d(TAG, "set flag for " + item.getTitle());
        item.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_ALWAYS);
    }
}

答案 5 :(得分:6)

还要确保您具有命名空间的正确路径。如果错误,它不会给你一个错误信息。

我有

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

而不是

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

我所知道的是它无法正常工作。不知道我是如何设法忘记路径的/ apk部分,但它发生了。没有错误信息,只是一个难以捉摸的错误追踪。

答案 6 :(得分:6)

在我的情况下,我不得不从我的应用程序的build.gradle编译中删除com.android.support:appcompat-v7:21.0.3&#39;。

注意:我的min sdk = 14,由android studio创建的项目插入了我不必要的依赖。

在此替换后你可以写  机器人:showAsAction =&#34;总是&#34;

答案 7 :(得分:4)

这可能不是你的情况,但我正在使用

new MenuInflater(this).inflate(R.menu.my_menu, menu);

将其更改为

getMenuInflater().inflate(R.menu.my_menu, menu);

解决了问题!

答案 8 :(得分:0)

<?xml version="1.0" encoding="utf-8"?>
<menu
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    >
    <item
        android:id="@id/back"
        android:icon="@drawable/back"
        app:showAsAction="always"
        android:title="@string/back"/>
    <item
        android:id="@id/save"
        android:icon="@drawable/le_top_btn_icon_add"
        app:showAsAction="ifRoom"
        android:title="@string/save"/>
</menu>

不工作,  with supportLibraryVersion =&#39; 25.1.0&#39; compileSdkVersion = 25

请参阅&#34;警告&#34;

应该使用带有appcompat库的app:showAsAction 的xmlns:应用程式=&#34; HTTP://schemas.android.com/apk/res-auto"少...(Ctrl + F1)

使用appcompat库时,菜单资源应引用app:namespace中的showAsAction, 不是android:名称空间。

同样,当不使用appcompat库时, 你应该使用android:showAsAction属性。

我认为警告可以被忽视。

答案 9 :(得分:0)

为showAsAction和actionViewClass添加自定义命名空间:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/search"
    android:title="@string/search"
    android:icon="@drawable/ic_search"
    app:showAsAction="collapseActionView|ifRoom"
    app:actionViewClass="android.widget.SearchView" />

答案 10 :(得分:0)

最简单的方法是:

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

    <item
        android:id="@+id/history"
        android:icon="@drawable/icons8_history_white_medium"
        android:title="History"
        myapp:showAsAction="always" />
    <item
        android:id="@+id/synchrnonize"
        android:icon="@drawable/icons8_synchronize_white_medium"
        android:title="Synchronize"
        myapp:showAsAction="always" />
</menu>

答案 11 :(得分:0)

我已经通过替换解决了

android:showAsAction="ifRoom"

app:showAsAction="ifRoom"

这是菜单 xml的样子,

<item android:id="@+id/action_refresh"
      android:title="Refresh"
      android:icon="@drawable/refresh2"
      app:showAsAction="ifRoom" />

答案 12 :(得分:0)

最简单的方法是 通过添加

修改代码
Private Sub FindWord(SearchRange As Range, SearchString As String, Optional CharacterLength As Long = 1)
    Dim LetterArray         As Variant
    Dim RangeArray          As Variant
    Dim ws                  As Worksheet
    Dim Letter              As Range
    Dim i                   As Long
    Dim SelectedRng         As Range
    Dim StringPosition      As Long
    Dim LastSearchIndex     As Long

    ReDim LetterArray(1 To SearchRange.Cells.Count)
    ReDim RangeArray(1 To SearchRange.Cells.Count)
    Set ws = SearchRange.Parent

    For Each Letter In SearchRange
        i = i + 1
        LetterArray(i) = Letter.Value2
        RangeArray(i) = Letter.Address
    Next

    StringPosition = WorksheetFunction.RoundUp((InStr(1, Join(LetterArray, vbNullString), SearchString) / CharacterLength), 0)
    If StringPosition <= 0 Then Exit Sub
    LastSearchIndex = WorksheetFunction.RoundUp((Len(SearchString) / CharacterLength), 0) + StringPosition - 1

    For i = StringPosition To LastSearchIndex
        If SelectedRng Is Nothing Then
            Set SelectedRng = ws.Range(RangeArray(i))
        Else
            Set SelectedRng = Union(SelectedRng, ws.Range(RangeArray(i)))
        End If
    Next

    SelectedRng.Select
End Sub

Sub SelectIt()
    Dim rng As Range
    Set rng = ThisWorkbook.Sheets("Sheet1").Range("A1:D4")

    FindWord rng, "developed", 2
End Sub

并更改此代码

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

android:showAsAction="always"

最后

app:showAsAction="always"