Mục menu của Android 4.3 showAsAction = “luôn luôn” bị bỏ qua


116

Tôi đang sử dụng thư viện appcompat v7 mới có sẵn bắt đầu từ Android 4.3 (API cấp 18).

Bất kể những gì được chỉ định trong showAsAction cho một mục menu, nó sẽ không được hiển thị - nó luôn tạo ra biểu tượng menu mục bổ sung và đặt ngay cả một mục menu duy nhất dưới menu.

Đang cố gắng thêm menu vào một hoạt động như thế này:

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

Và đây là xml menu của tôi:

<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>

Đó có phải là lỗi của thư viện hỗ trợ mới v7, hay chỉ là lỗi với mã? Tôi đã sử dụng mã tương tự với ActionBarSherlock nhiều lần trước đây.


2
Đối với mục đích thông tin - "... "always"không được khuyến khích; tốt hơn là sử dụng "ifRoom"và để Hệ điều hành quyết định."
ChiefTwoPencils,

Câu trả lời:


313

Có thể bạn đang thiếu không gian tên bắt buộc:

<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>

Thay thế [yourapp]bằng tên ứng dụng của bạn hoặc bất kỳ không gian tên nào mà trái tim bạn mong muốn ở mọi nơi.

Những thứ khác đáng kiểm tra:

  • Xem lớp hoạt động của bạn có mở rộng không ActionBarActivity

Kiểm tra xem sự cố vẫn tiếp diễn.


Tài liệu tham khảo Android: Thêm các nút hành động . Đây là văn bản có liên quan:

Nếu ứng dụng của bạn đang sử dụng Thư viện hỗ trợ để có khả năng tương thích trên các phiên bản thấp như Android 2.1, thì thuộc tính showAsAction không khả dụng trong không gian tên android:. Thay vào đó, thuộc tính này do Thư viện hỗ trợ cung cấp và bạn phải xác định không gian tên XML của riêng mình và sử dụng không gian tên đó làm tiền tố thuộc tính. (Không gian tên XML tùy chỉnh phải dựa trên tên ứng dụng của bạn, nhưng nó có thể là bất kỳ tên nào bạn muốn và chỉ có thể truy cập được trong phạm vi tệp mà bạn khai báo.)


2
Đó là những gì tôi đã tìm ra. Cảm ơn bạn - chắc chắn được chấp nhận. Nhưng showAsAction nên sử dụng không gian tên tùy chỉnh đó.
Mcingwe

5
'yourapp' có nghĩa là trong String.xml <string name = "app_name"> yourapp </string> phải không?
LOG_TAG

4
Ai đó có thể giải thích TẠI SAO điều này hoạt động? Tại sao cần phải mở rộng không gian tên tùy chỉnh? Hơi bối rối.
ăn tối

8
@dineth appcompat được sử dụng như một dự án thư viện. Điều này có nghĩa là tất cả các tài nguyên của nó (chuỗi, có thể vẽ, thuộc tính ...) được khai báo trong không gian tên ứng dụng của bạn thay vì không gian tên android. Khi showAsActionthuộc tính không tồn tại trong android-7, bạn phải sử dụng tên miền không gian ứng dụng của bạn
nicopico

22
Mọi người đều nói "không gian tên tùy chỉnh" hoặc "không gian tên phù hợp với ứng dụng của bạn". Nhưng không gian tên luôn có http://schemas.android.com/apk/res-autotrong mọi ví dụ. Đó không phải là tùy chỉnh hoặc phù hợp với ứng dụng của bạn. Đó là không gian tên thực tế từ tài liệu. Tôi nghĩ mọi người có nghĩa là một tiền tố tùy chỉnh và nó thực sự có thể là bất cứ điều gì bạn muốn. Điều này có đúng không?
Andrew Arnott

52

Tự mình tìm ra. Với thư viện hỗ trợ v7, showAsAction sẽ nằm trong một không gian tên tùy chỉnh như sau:

<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>

1
'bubbleberry' có nghĩa là trong String.xml "<string name =" app_name "> bubbleberry </string>" phải không?
LOG_TAG

5
@LOG_TAG - không, nó phải như đã nhập ở trên. Đây không phải là một chuỗi, mà là một không gian tên.
BeccaP

ohhh hỗ trợ v7 errr ... ok của nó đối với sự ủng hộ v4
Yasitha Waduge

Cảm ơn vì lời giải thích Mcingwe
Sachidananda Naik

32

Ngoài ra, hãy đảm bảo rằng bạn sử dụng đúng bộ đệm trong phương thức ActionBarActivity.onCreateOptionsMenu ().

Giải pháp đúng:

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

Giải pháp không chính xác:

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

1
Tôi đã vượt qua tất cả các câu trả lời ở trên và một câu trả lời khác trên stackoverflow, nhưng điều duy nhất tôi thiếu là bạn trả lời - getMenuInflater (). Cảm ơn vì đã chia sẻ điều này.
Amt87

Cảm ơn bạn RẤT NHIỀU vì điều này. Tôi đã chuyển đổi tất cả hơn 100 menu của mình để sử dụng không gian tên tùy chỉnh và 1 màn hình stinkin 'vẫn không hoạt động ... hóa ra 1 hoạt động đang sử dụng "MenuInflater mới" thay vì getMenuInflater (). Cảm ơn rất nhiều!
DiscDev

cái này rất quan trọng. Tôi đã sử dụng tạo menuInflater (2 cách). Cảm ơn
wtk

24

Đối với các mảnh vỡ

Menu với không gian tên tùy chỉnh sẽ ngăn showAsAction hiển thị.

Sử dụng tiền tố "android:" cho showAsAction sẽ hoạt động, mặc dù Android Studio sẽ nhận xét rằng bạn nên sử dụng không gian tên tùy chỉnh.

<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>

Điều này đang sử dụng Android SDK 22 và các phân đoạn Hỗ trợ v4, trong trường hợp có bất kỳ sự khác biệt nào.


Đó là điều duy nhất đã giải quyết được Vấn đề của tôi (mặc dù nó đang hiển thị lỗi này). Cảm ơn !
dùng2630165

3
Bạn có thể loại bỏ lỗi / cảnh báo trong bố cục XML bằng các công cụ: ignore = "AppCompatResource" trong <item>. Documents ở đây: tools.android.com/tips/lint/suppressing-lint-warnings
Baker

Câu trả lời của bạn và Anton Kizema là giải pháp phù hợp cho tôi. Và cũng cảm ơn vì tiền boa tools:ignore.
hata

16

Gặp vấn đề tương tự, nhưng trên Android 5. Tôi có 3 mục nhưng hệ điều hành đã bỏ qua thuộc tính "luôn luôn" của tôi và chỉ hiển thị 2 mục. Đây là giải pháp của tôi:

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

1
setShowAsActionFlags()yêu cầu API 14, nhưng đây vẫn là giải pháp tốt nhất đối với tôi.
Mr. Bungle

6

Đồng thời đảm bảo rằng bạn có đường dẫn chính xác cho không gian tên. Nó sẽ không cung cấp cho bạn một thông báo lỗi nếu nó sai.

Tôi đã có

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

thay vì

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

Tất cả những gì tôi biết là nó không hoạt động. Không chắc làm thế nào tôi quản lý để quên phần / apk của đường dẫn, nhưng nó đã xảy ra. Không có thông báo lỗi, chỉ là một lỗi khó nắm bắt để theo dõi.


6

Trong trường hợp của tôi, tôi đã phải xóa khỏi biên dịch build.gradle 'com.android.support:appcompat-v7:21.0.3' của ứng dụng.

Lưu ý : Tối thiểu sdk = 14 của tôi và dự án được tạo bởi studio android đã chèn sự phụ thuộc không cần thiết của tôi.

Sau khi thay thế này, bạn có thể viết android: showAsAction = "always"


Cảm ơn nó đã giải quyết cho tôi! Ngày nay có lẽ là giải pháp tốt nhất trong hầu hết các trường hợp, vì không cần thiết phải hỗ trợ các phiên bản Android trước 4.0.
pinyin_samu

Câu trả lời của bạn và Baker's là giải pháp phù hợp cho tôi.
hata

4

Đây có thể không phải là trường hợp của bạn nhưng tôi đã sử dụng

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

thay đổi nó thành

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

đã khắc phục sự cố!


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>

không hoạt động với supportLibraryVersion = '25 .1.0 'compileSdkVersion = 25

xem "Cảnh báo"

Nên sử dụng app: showAsAction với thư viện appcompat với xmlns: app = "http://schemas.android.com/apk/res-auto" bớt ... (Ctrl + F1)

Khi sử dụng thư viện appcompat, tài nguyên menu nên tham chiếu đến showAsAction trong app: namespace, không phải android: namespace.

Tương tự, khi không sử dụng thư viện appcompat, bạn nên sử dụng thuộc tính android: showAsAction.

Tôi nghĩ rằng cảnh báo có thể được bỏ qua.


0

thêm không gian tên tùy chỉnh như thế này vào showAsAction và 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" />


0

Tôi đã giải quyết nó bằng cách thay thế

android:showAsAction="ifRoom"

với

app:showAsAction="ifRoom"

Đó là menuitme xml trông giống như,

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

0

Cách đơn giản nhất là Sửa đổi mã của bạn bằng cách thêm

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

và thay đổi mã này

android:showAsAction="always"

đến

app:showAsAction="always"

và cuối cùng

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item android:id="@+id/menu_add_size"
        android:title="@string/menu_add_item"
        android:orderInCategory="10"
        app:showAsAction="always"
        android:icon="@android:drawable/ic_menu_add" />
</menu>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.