Saya mencoba mengubah warna default untuk menu opsi yang putih: Saya ingin latar belakang hitam untuk setiap item di menu opsi.
Saya telah mencoba beberapa pemotretan seperti android: itemBackground = "# 000000" pada elemen item dalam elemen menu tetapi tidak berhasil.
Bagaimana saya bisa melakukannya?
android
user-interface
layout-inflater
feragusper
sumber
sumber
Jawaban:
Setelah menghabiskan cukup banyak waktu untuk mencoba semua opsi, satu-satunya cara saya bisa mendapatkan aplikasi menggunakan AppCompat v7 untuk mengubah latar belakang menu tambahan adalah menggunakan atribut itemBackground:
Diuji dari API 4.2 hingga 5.0.
sumber
Ini jelas merupakan masalah yang dihadapi banyak pemrogram dan Google belum memberikan solusi yang didukung dan memuaskan.
Ada banyak niat silang dan kesalahpahaman yang beredar di sekitar postingan tentang topik ini, jadi harap baca seluruh jawaban ini sebelum menanggapi.
Di bawah ini saya menyertakan versi peretasan yang lebih "halus" dan dikomentari dengan baik dari jawaban lain di laman ini, juga menggabungkan gagasan dari pertanyaan yang sangat terkait ini:
Ubah warna latar belakang menu android
Bagaimana cara mengubah warna latar belakang dari menu opsi?
Android: sesuaikan menu aplikasi (mis. Warna latar belakang)
http://www.macadamian.com/blog/post/android_-_theming_the_unthemable/
Tombol Toggle Item Menu Android
Apakah mungkin membuat latar belakang menu opsi Android tidak tembus cahaya?
http://www.codeproject.com/KB/android/AndroidMenusMyWay.aspx
Menyetel latar belakang menu menjadi buram
Saya menguji peretasan ini pada 2.1 (simulator), 2.2 (2 perangkat nyata), dan 2.3 (2 perangkat nyata). Saya belum memiliki tablet 3.X untuk diuji, tetapi akan memposting perubahan yang diperlukan di sini jika / jika saya melakukannya. Mengingat bahwa tablet 3.X menggunakan Bilah Tindakan alih-alih Menu Opsi, seperti yang dijelaskan di sini:
http://developer.android.com/guide/topics/ui/menus.html#options-menu
Peretasan ini hampir pasti tidak akan melakukan apa pun (tidak merugikan dan tidak berguna) pada tablet 3.X.
PERNYATAAN MASALAH (baca ini sebelum membalas pemicu dengan komentar negatif):
Menu Opsi memiliki gaya yang sangat berbeda pada perangkat yang berbeda. Hitam murni dengan teks putih di beberapa, putih bersih dengan teks hitam di beberapa. Saya dan banyak pengembang lain ingin mengontrol warna latar belakang sel menu Opsi serta warna teks menu Opsi .
Pengembang aplikasi tertentu hanya perlu menyetel warna latar belakang sel (bukan warna teks), dan mereka dapat melakukannya dengan cara yang lebih rapi menggunakan gaya android: panelFullBackground yang dijelaskan dalam jawaban lain. Namun, saat ini tidak ada cara untuk mengontrol warna teks menu Opsi dengan gaya, sehingga seseorang hanya dapat menggunakan metode ini untuk mengubah latar belakang ke warna lain yang tidak akan membuat teks "menghilang".
Kami akan senang melakukan ini dengan solusi terdokumentasi, bukti masa depan, tetapi satu tidak tersedia pada Android <= 2.3. Jadi kita harus menggunakan solusi yang berfungsi di versi saat ini dan dirancang untuk meminimalkan kemungkinan rusak / rusak di versi mendatang. Kami menginginkan solusi yang gagal dengan anggun kembali ke perilaku default jika harus gagal.
Ada banyak alasan yang sah mengapa seseorang mungkin perlu mengontrol tampilan menu Opsi (biasanya agar sesuai dengan gaya visual untuk sisa aplikasi) jadi saya tidak akan memikirkannya.
Ada bug Google Android yang diposting tentang ini: harap tambahkan dukungan Anda dengan memberi bintang pada bug ini (catatan Google melarang komentar "saya juga": cukup bintang saja):
http://code.google.com/p/android/issues/detail?id=4441
RINGKASAN SOLUSI JAUH:
Beberapa poster menyarankan peretasan yang melibatkan LayoutInflater.Factory. Peretasan yang disarankan berfungsi untuk Android <= 2.2 dan gagal untuk Android 2.3 karena peretasan tersebut membuat asumsi yang tidak terdokumentasi: bahwa seseorang dapat memanggil LayoutInflater.getView () secara langsung tanpa saat ini berada di dalam panggilan ke LayoutInflater.inflate () pada instance LayoutInflater yang sama. Kode baru di Android 2.3 mematahkan asumsi ini dan menyebabkan NullPointerException.
Peretasan saya yang sedikit halus di bawah ini tidak bergantung pada asumsi ini.
Selain itu, peretasan juga mengandalkan penggunaan nama kelas internal yang tidak terdokumentasi "com.android.internal.view.menu.IconMenuItemView" sebagai string (bukan sebagai tipe Java). Saya tidak melihat cara untuk menghindari ini dan masih mencapai tujuan yang dinyatakan. Namun, Anda dapat melakukan peretasan dengan hati-hati yang akan mundur jika "com.android.internal.view.menu.IconMenuItemView" tidak muncul di sistem saat ini.
Sekali lagi, pahami bahwa ini adalah peretasan dan saya tidak mengklaim ini akan berfungsi di semua platform. Tapi kami para pengembang tidak hidup dalam dunia akademis fantasi di mana segala sesuatu harus sesuai dengan buku: kami memiliki masalah yang harus diselesaikan dan kami harus menyelesaikannya sebaik mungkin. Misalnya, "com.android.internal.view.menu.IconMenuItemView" tampaknya tidak mungkin ada di tablet 3.X karena mereka menggunakan Bilah Tindakan dan bukan Menu Opsi.
Akhirnya, beberapa pengembang telah memecahkan masalah ini dengan sepenuhnya menekan Menu Opsi Android dan menulis kelas menu mereka sendiri (lihat beberapa tautan di atas). Saya belum mencoba ini, tetapi jika Anda punya waktu untuk menulis Tampilan Anda sendiri dan mencari cara untuk mengganti tampilan Android (saya yakin iblis ada dalam detail di sini) maka itu mungkin solusi yang bagus yang tidak memerlukan peretasan tidak berdokumen.
HACK:
Ini kodenya.
Untuk menggunakan kode ini, panggil addOptionsMenuHackerInflaterFactory () ONCE dari aktivitas Anda onCreate () atau aktivitas Anda onCreateOptionsMenu (). Ini menetapkan pabrik default yang akan mempengaruhi pembuatan Menu Opsi selanjutnya. Ini tidak memengaruhi Menu Opsi yang telah dibuat (peretasan sebelumnya menggunakan nama fungsi setMenuBackground (), yang sangat menyesatkan karena fungsi tersebut tidak menyetel properti menu apa pun sebelum dikembalikan).
Terimakasih telah membaca dan semoga bisa menikmati!
sumber
Atribut gaya untuk latar belakang menu adalah
android:panelFullBackground
.Terlepas dari apa yang dikatakan dalam dokumentasinya, ia harus berupa sumber daya (misalnya
@android:color/black
atau@drawable/my_drawable
), ia akan macet jika Anda menggunakan nilai warna secara langsung.Ini juga akan menghilangkan batas item yang tidak dapat saya ubah atau hapus menggunakan solusi primalpop.
Sedangkan untuk warna teks, saya belum menemukan cara untuk mengaturnya melalui gaya di 2.2 dan saya yakin saya sudah mencoba semuanya (begitulah cara saya menemukan atribut latar belakang menu). Anda perlu menggunakan solusi primalpop untuk itu.
sumber
Untuk Android 2.3, ini dapat dilakukan dengan beberapa peretasan yang sangat berat:
Penyebab utama masalah Android 2.3 adalah di LayoutInflater, mConstructorArgs [0] = mContext hanya disetel selama menjalankan panggilan ke
http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.3.3_r1/android/view/LayoutInflater.java/#352
Saya mengujinya untuk bekerja pada Android 2.3 dan masih bekerja pada versi sebelumnya. Jika ada yang rusak lagi di versi Android selanjutnya Anda hanya akan melihat gaya menu default sebagai gantinya
sumber
Baru saja mengalami masalah ini juga, pada Aplikasi yang harus kompatibel dengan Gingerbread dan masih mempertahankan sebanyak mungkin gaya dari perangkat yang mendukung Holo.
Saya menemukan solusi yang relatif bersih, yang berfungsi baik untuk saya.
Dalam tema, saya menggunakan latar belakang drawable 9-patch untuk mendapatkan warna latar kustom:
Saya berhenti mencoba memberi gaya pada warna teks, dan hanya menggunakan Spannable untuk mengatur warna teks untuk item saya dalam kode:
sumber
Beginilah cara saya memecahkan masalah saya. Saya baru saja menentukan warna latar belakang dan warna teks dalam gaya. yaitu res> nilai> file styles.xml.
sumber
Satu hal yang perlu diperhatikan bahwa kalian terlalu memperumit masalah seperti banyak pos lainnya! Yang perlu Anda lakukan adalah membuat pemilih yang dapat digambar dengan latar belakang apa pun yang Anda butuhkan dan mengaturnya ke item sebenarnya. Saya hanya menghabiskan dua jam mencoba solusi Anda (semua disarankan di halaman ini) dan tidak ada yang berhasil. Belum lagi ada banyak kesalahan yang pada dasarnya memperlambat kinerja Anda dalam blok coba / tangkap yang Anda miliki.
Anyways di sini adalah file menu xml:
Sekarang di item1_selector Anda:
Lain kali Anda memutuskan untuk pergi ke supermarket melalui Kanada, coba peta google!
sumber
ini bekerja dengan baik untuk saya
sumber
sumber
Terima kasih Marcus! Ini berfungsi pada 2.3 dengan lancar dengan memperbaiki beberapa kesalahan sintaks, inilah kode yang diperbaiki
sumber
ini adalah file XML
sumber
Jika Anda ingin menetapkan warna sewenang-wenang, ini tampaknya berfungsi dengan baik
androidx
. Diuji di KitKat dan Pie. Masukkan ini ke dalamAppCompatActivity
:Ini mengatur warna
android.widget.PopupWindow$PopupBackgroundView
, yang, seperti yang mungkin sudah Anda duga, akan menggambar warna latar belakang. Tidak ada penarikan berlebih dan Anda juga dapat menggunakan warna semi transparan.sumber