Item menu Android 4.3 showAsAction = "selalu" diabaikan


116

Saya menggunakan pustaka appcompat v7 baru yang tersedia mulai dari Android 4.3 (API level 18).

Terlepas dari apa yang ditentukan dalam showAsAction untuk item menu, itu tidak ditampilkan - itu selalu membuat ikon menu tambahan, dan menempatkan bahkan satu item menu di bawah menu.

Mencoba menambahkan menu ke aktivitas seperti ini:

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

Dan inilah menu saya 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>

Apakah ini bug dari pustaka dukungan baru v7, atau hanya ada yang salah dengan kodenya? Saya telah menggunakan kode serupa dengan ActionBarSherlock berkali-kali sebelumnya.


2
Untuk tujuan informasional - "... "always"tidak disarankan; lebih baik gunakan "ifRoom"dan biarkan OS memutuskan."
ChiefTwoPencils

Jawaban:


313

Mungkin Anda tidak memiliki namespace yang diperlukan:

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

Ganti [yourapp]dengan nama aplikasi Anda atau namespace apa pun yang diinginkan hati Anda di mana saja.

Hal-hal lain yang perlu diperiksa:

  • Lihat apakah kelas aktivitas Anda meluas ActionBarActivity

Periksa apakah masalah terus berlanjut.


Dokumentasi referensi Android: Menambahkan Tombol Tindakan . Ini teks yang relevan:

Jika aplikasi Anda menggunakan Support Library untuk kompatibilitas pada versi paling rendah Android 2.1, atribut showAsAction tidak tersedia dari namespace android:. Sebaliknya atribut ini disediakan oleh Support Library dan Anda harus menentukan namespace XML Anda sendiri dan menggunakan namespace tersebut sebagai awalan atribut. (Namespace XML khusus harus didasarkan pada nama aplikasi Anda, tetapi bisa berupa nama apa pun yang Anda inginkan dan hanya dapat diakses dalam cakupan file tempat Anda mendeklarasikannya.)


2
Itulah yang saya temukan juga. Terima kasih - pasti diterima. Tapi showAsAction harus menggunakan namespace kustom itu.
Mcingwe

5
'yourapp' berarti dalam String.xml <string name = "app_name"> yourapp </ string> kan?
LOG_TAG

4
Adakah yang bisa menjelaskan MENGAPA ini berhasil? Mengapa ada kebutuhan untuk memperluas namespace kustom? Sedikit bingung.
makan malam

8
@dineth appcompat digunakan sebagai proyek perpustakaan. Ini berarti semua sumber dayanya (string, drawable, atribut ...) dideklarasikan di namespace aplikasi Anda, bukan di namespace android. Karena showAsActionatribut tidak ada di android-7, Anda harus menggunakan namespace aplikasi Anda
nicopico

22
Semua orang mengatakan "ruang nama khusus" atau "ruang nama yang cocok dengan aplikasi Anda". Tapi namespace selalu ada http://schemas.android.com/apk/res-autodi setiap contoh. Itu bukan yang khusus, atau yang cocok dengan aplikasi Anda. Itulah namespace sebenarnya dari dokumentasi. Saya pikir semua orang berarti awalan khusus , dan itu sebenarnya bisa menjadi apa pun yang Anda inginkan. Apakah ini benar?
Andrew Arnott

52

Pikir sendiri. Dengan pustaka dukungan v7, showAsAction harus berada di bawah ruang nama khusus seperti ini:

<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
'balloonberry' artinya di String.xml "<string name =" app_name "> balloonberry </ string>" kan?
LOG_TAG

5
@LOG_TAG - tidak, hanya seperti yang dimasukkan di atas. Ini bukan string, tapi namespace.
BeccaP

ohhh mendukung v7 errr ... tidak apa-apa pada dukungan v4
Yasitha Waduge

Terima kasih atas penjelasan Mcingwe
Sachidananda Naik

32

Pastikan juga Anda menggunakan inflater yang benar dalam metode ActionBarActivity.onCreateOptionsMenu ().

Solusi yang benar:

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

Solusi yang salah:

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

1
Saya telah menyampaikan semua jawaban di atas dan jawaban lain di stackoverflow, tetapi satu-satunya hal yang saya lewatkan adalah Anda menjawab - getMenuInflater (). Terima kasih telah membagikan ini.
Amt87

Terima kasih BANYAK untuk yang satu ini. Saya mengonversi semua 100+ menu saya untuk menggunakan namespace kustom dan layar 1 stinkin 'masih tidak berfungsi ... ternyata 1 aktivitas menggunakan "MenuInflater baru" alih-alih getMenuInflater (). Terima kasih banyak!
DiscDev

ini sangat penting. Saya menggunakan pembuatan menuInflater (2 arah). Terima kasih
wtk

24

Untuk Fragmen

Menu dengan namespace kustom akan mencegah showAsAction ditampilkan.

Menggunakan awalan "android:" untuk showAsAction akan berfungsi, meskipun Android Studio akan berkomentar bahwa Anda harus menggunakan ruang nama khusus.

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

Ini menggunakan fragmen Android SDK 22 dan Support v4, jika ada perbedaan.


Itulah satu-satunya hal yang memecahkan Masalah Saya (meskipun itu menunjukkan kesalahan ini). Terima kasih!
pengguna2630165

3
Anda bisa menyembunyikan kesalahan / peringatan dalam tata letak XML dengan alat: ignore = "AppCompatResource" dalam <item>. Dokumen di sini: tools.android.com/tips/lint/suppressing-lint-warnings
roti

Jawaban Anda dan Anton Kizema adalah solusi yang tepat untuk saya. Dan juga terima kasih atas tipnya tools:ignore.
hata

16

Punya masalah yang sama, tetapi di Android 5. Saya punya 3 item tetapi OS mengabaikan atribut saya "selalu" dan hanya menampilkan 2 item. Ini solusi saya:

  @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()membutuhkan API 14, tetapi ini masih solusi terbaik untuk saya.
Tuan Bungle

6

Pastikan juga Anda memiliki jalur yang benar untuk namespace. Itu tidak akan memberi Anda pesan kesalahan jika itu salah.

Saya punya

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

dari pada

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

Yang saya tahu adalah bahwa itu tidak berhasil. Tidak yakin bagaimana saya berhasil melupakan bagian / apk dari jalur tersebut, tetapi hal itu terjadi. Tidak ada pesan kesalahan, hanya bug yang sulit dilacak.


6

Dalam kasus saya, saya harus menghapus kompilasi build.gradle aplikasi saya 'com.android.support:appcompat-v7:21.0.3'.

Memperhatikan : Min sdk = 14 saya, dan proyek yang dibuat oleh studio android memasukkan ketergantungan saya yang tidak perlu.

Setelah penggantian ini, Anda dapat menulis android: showAsAction = "always"


Terima kasih itu memecahkan saya! Saat ini mungkin solusi terbaik dalam banyak kasus, karena tidak perlu mendukung versi Android sebelum 4.0.
pinyin_samu

Jawaban Anda dan Baker adalah solusi yang tepat untuk saya.
hata

4

Ini mungkin bukan kasus Anda, tetapi saya menggunakan

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

mengubahnya menjadi

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

perbaiki masalahnya!


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>

tidak berfungsi, dengan supportLibraryVersion = '25 .1.0 'compileSdkVersion = 25

lihat "Peringatan"

Harus menggunakan app: showAsAction dengan pustaka appcompat dengan xmlns: app = "http://schemas.android.com/apk/res-auto" lebih sedikit ... (Ctrl + F1)

Saat menggunakan pustaka appcompat, sumber daya menu harus merujuk ke showAsAction di app: namespace, bukan android: namespace.

Demikian pula, saat tidak menggunakan pustaka appcompat, Anda harus menggunakan atribut android: showAsAction.

Saya pikir peringatan itu bisa diabaikan.


0

tambahkan namespace kustom seperti ini ke showAsAction dan 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

Saya telah menyelesaikannya dengan mengganti

android:showAsAction="ifRoom"

dengan

app:showAsAction="ifRoom"

Itu adalah tampilan menuitme xml,

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

0

Cara termudah adalah memodifikasi kode Anda dengan menambahkan

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

dan ubah kode ini

android:showAsAction="always"

untuk

app:showAsAction="always"

dan akhirnya

<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>
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.