Android 4.3 menü öğesi showAsAction = "her zaman" yok sayıldı


116

Android 4.3'ten (API seviyesi 18) itibaren mevcut olan yeni v7 uygulama uyumluluğu kitaplığını kullanıyorum.

Bir menü öğesi için showAsAction'da neyin belirtildiğine bakılmaksızın, gösterilmez - her zaman taşma menüsü simgesini oluşturur ve menünün altına tek bir menü öğesi bile yerleştirir.

Bunun gibi bir etkinliğe menü eklemeye çalışıyorum:

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

Ve işte menüm 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>

Yeni destek kitaplığı v7'deki bir hata mı yoksa kodla ilgili bir sorun mu var? Benzer kodu ActionBarSherlock ile daha önce birçok kez kullanıyordum.


2
Bilgilendirme amacıyla - "... "always"tavsiye edilmez; kullanmak "ifRoom"ve işletim sisteminin karar vermesine izin vermek daha iyidir ."
ChiefTwoPencils

Yanıtlar:


313

Muhtemelen gerekli ad alanını kaçırıyorsunuz:

<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]Uygulamanızın adını veya her yerde kalbinizin istediği herhangi bir ad alanını değiştirin .

Kontrol etmeye değer diğer şeyler:

  • Aktivite sınıfınızın genişleyip genişlemediğini görün ActionBarActivity

Sorunun devam edip etmediğini kontrol edin.


Android referans belgeleri: İşlem Düğmeleri Ekleme . İşte ilgili metin:

Uygulamanız Android 2.1 kadar düşük sürümlerde uyumluluk için Destek Kitaplığı kullanıyorsa, showAsAction özelliği android: ad alanından kullanılamaz. Bunun yerine bu öznitelik Destek Kitaplığı tarafından sağlanır ve kendi XML ad alanınızı tanımlamanız ve bu ad alanını öznitelik öneki olarak kullanmanız gerekir. (Özel bir XML ad alanı, uygulamanızın adını temel almalıdır, ancak istediğiniz herhangi bir ad olabilir ve yalnızca içinde belirttiğiniz dosya kapsamında erişilebilir.)


2
Ben de bunu öğrendim. Teşekkür ederim - kesinlikle kabul edildi. Ancak showAsAction bu özel ad alanını kullanmalıdır.
Mcingwe

5
'uygulamanız' String.xml <string name = "uygulama_adı"> uygulamanız </string> anlamına gelir değil mi?
LOG_TAG

4
Birisi bunun NEDEN işe yaradığını açıklayabilir mi? Neden özel bir ad alanını genişletmeye ihtiyaç var? Biraz kafam karıştı.
2013,

8
@dineth appcompat bir kütüphane projesi olarak kullanılır. Bu, tüm kaynaklarının (dizeler, çekilebilir özellikler, öznitelikler ...) android ad alanı yerine uygulamanızın ad alanında bildirildiği anlamına gelir. As showAsActionnitelik android-7'de olmasaydı, uygulamanızın ad kullanmak zorunda
nicopico

22
Herkes "özel ad alanı" veya "uygulamanızla eşleşen bir ad alanı" diyor. Ancak ad alanı her zaman http://schemas.android.com/apk/res-autoher örnekte bulunur. Bu özel veya uygulamanıza uyan değil. Dokümantasyondaki gerçek ad alanı budur. Bence herkes özel bir önek anlamına geliyor ve aslında istediğiniz her şey olabilir. Bu doğru mu?
Andrew Arnott

52

Kendim anladım. Destek kitaplığı v7 ile showAsAction şunun gibi özel bir ad alanı altına girmelidir:

<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' String.xml'de "<string name =" app_name "> balon üzümü </string>" anlamına gelir, değil mi?
LOG_TAG

5
@LOG_TAG - hayır, sadece yukarıda girildiği gibi olmalıdır. Bu bir dize değil, bir ad alanıdır.
BeccaP

ohhh destek v7
hatası

Açıklama için teşekkürler Mcingwe
Sachidananda Naik

32

Ayrıca ActionBarActivity.onCreateOptionsMenu () yönteminde doğru şişiriciyi kullandığınızdan emin olun.

Doğru çözüm:

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

Yanlış çözüm:

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

1
Stackoverflow ile ilgili yukarıdaki tüm cevapları ve başka cevapları geçtim, ancak eksik olduğum tek şey cevabınız - getMenuInflater (). Bunu paylaştığın için teşekkürler
Amt87

Bunun için ÇOK teşekkür ederim. 100'den fazla menümün tamamını özel bir ad alanı kullanacak şekilde dönüştürdüm ve 1 pislik ekranı hala çalışmıyor ... 1 etkinliğin getMenuInflater () yerine "yeni MenuInflater" kullandığı ortaya çıktı. Çok teşekkürler!
DiscDev

Bu çok önemli. MenuInflater oluşturmayı kullanıyordum (2 yollu). Teşekkürler
wtk

24

için Fragments

Özel ad alanına sahip menüler, showAsAction'ın gösterilmesini engeller .

ShowAsAction için "android:" önekini kullanmak işe yarayacaktır, ancak Android Studio özel bir ad alanı kullanmanız gerektiğini belirtecektir .

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

Bu, herhangi bir fark yaratması durumunda Android SDK 22 ve Support v4 parçalarını kullanıyor.


Sorunumu çözen tek şey bu (bu hatayı gösteriyor olsa da). Teşekkürler !
user2630165

3
XML düzenindeki hatayı / uyarıyı <item> içindeki araçları kullanarak bastırabilirsiniz: ignore = "AppCompatResource". Buradaki dokümanlar: tools.android.com/tips/lint/suppressing-lint-warnings
Baker

Cevabınız ve Anton Kizema'nın benim için doğru çözümler. Ve ayrıca bahşiş için teşekkürler tools:ignore.
hata

16

Aynı sorunu aldım, ancak Android 5'te 3 öğem var ancak işletim sistemi "her zaman" özelliğimi yok saydı ve yalnızca 2 öğe gösterdi. İşte benim çözümüm:

  @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()API 14 gerektiriyor, ancak bu hala benim için en iyi çözümdü.
Bay Bungle

6

Ayrıca ad alanı için doğru yola sahip olduğunuzdan emin olun. Yanlış olursa size bir hata mesajı vermez.

sahiptim

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

onun yerine

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

Tek bildiğim işe yaramadığıydı. Yolun / apk kısmını nasıl unuttuğumdan emin değilim ama oldu. Hata mesajı yok, sadece bulunması zor bir hata.


6

Benim durumumda, uygulamamın build.gradle derlemesinden 'com.android.support:appcompat-v7:21.0.3' kaldırmak zorunda kaldım.

Farkına varmak : Benim min sdk = 14 ve android stüdyosu tarafından oluşturulan projem gereksiz bağımlılığımı ekledi.

Bu değiştirmeden sonra android: showAsAction = "her zaman" yazabilirsiniz.


Teşekkürler beni çözdü! Bu günlerde belki de çoğu durumda en iyi çözüm, çünkü 4.0'dan önceki Android sürümlerini desteklemek gereksiz.
pinyin_samu

Cevabınız ve Baker benim için doğru çözümler.
hata

4

Bu senin davan olmayabilir ama ben kullanıyordum

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

olarak değiştirmek

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

sorunu çözdü!


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>

supportLibraryVersion = '25 .1.0 'compileSdkVersion = 25 ile çalışmaz

"Uyarı" bölümüne bakın

Xmlns: app = "http://schemas.android.com/apk/res-auto" ile appcompat kitaplığıyla birlikte app: showAsAction kullanmalısınız ... (Ctrl + F1)

Appcompat kitaplığını kullanırken, menü kaynakları android: ad alanına değil, app: ad alanındaki showAsAction'a başvurmalıdır.

Benzer şekilde, appcompat kitaplığını kullanmadığınızda, android: showAsAction özniteliğini kullanmalısınız.

Bence uyarı görmezden gelinebilir.


0

showAsAction ve actionViewClass'a bunun gibi özel ad alanı ekleyin:

<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

Değiştirerek çözdüm

android:showAsAction="ifRoom"

ile

app:showAsAction="ifRoom"

Bu menuitme xml gibi görünüyor,

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

0

En basit yol, kodunuzu ekleyerek değiştirmektir.

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

ve bu kodu değiştir

android:showAsAction="always"

için

app:showAsAction="always"

ve sonunda

<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>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.