我正在使用从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类似的代码。
答案 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"