Saya mencoba mengubah drawable yang ada di widget tampilan pencarian bilah tindakan Android.
Saat ini terlihat seperti ini:
tapi saya perlu mengubah drawable latar belakang biru menjadi warna merah.
Saya sudah mencoba banyak hal selain menjalankan widget pencarian saya sendiri, tetapi tidak ada yang berhasil.
Bisakah seseorang mengarahkan saya ke arah yang benar untuk mengubah ini?
SearchView
latar belakang karena tidak tersedia dalam melaluiR.styleable
. Jawaban saya di bawah ini menjelaskan bagaimana melakukannya dalam kode.Jawaban:
Intro
Sayangnya, tidak ada cara untuk menyetel
SearchView
gaya bidang teks menggunakan tema, gaya, dan warisan dalam XML seperti yang dapat Anda lakukan dengan latar belakang item di tarik-turun ActionBar . Hal ini karenaselectableItemBackground
terdaftar sebagai styleable diR.stylable
, sedangkansearchViewTextField
(atribut tema yang kita tertarik) tidak. Jadi, kami tidak dapat mengaksesnya dengan mudah dari dalam sumber daya XML (Anda akan mendapatkanNo resource found that matches the given name: attr 'android:searchViewTextField'
kesalahan).Mengatur latar belakang bidang teks SearchView dari kode
Jadi, satu-satunya cara untuk mengganti latar belakang
SearchView
bidang teks dengan benar adalah dengan masuk ke bagian dalamnya, memperoleh akses ke tampilan yang memiliki latar belakang berdasarkansearchViewTextField
dan menetapkan milik kita sendiri.CATATAN: Solusi di bawah ini hanya bergantung pada id (
android:id/search_plate
) elemen di dalamnyaSearchView
, jadi ini lebih independen dari versi SDK daripada traversal turunan (misalnya menggunakansearchView.getChildAt(0)
untuk mendapatkan tampilan yang benar di dalamnyaSearchView
), tetapi ini bukan anti peluru. Terutama jika beberapa pabrikan memutuskan untuk menerapkan ulang internal dariSearchView
dan elemen dengan id yang disebutkan di atas tidak ada - kode tidak akan berfungsi.Di SDK, latar belakang untuk bidang teks di
SearchView
dideklarasikan melalui sembilan tambalan , jadi kami akan melakukannya dengan cara yang sama. Anda dapat menemukan gambar png asli di direktori drawable-mdpi dari repositori git Android . Kami tertarik pada dua gambar. Satu untuk status ketika bidang teks dipilih (dinamai textfield_search_selected_holo_light.9.png ) dan satu untuk tempat yang bukan (dinamai textfield_search_default_holo_light.9.png ).Sayangnya, Anda harus membuat salinan lokal dari kedua gambar tersebut, meskipun Anda hanya ingin menyesuaikan status fokus . Ini karena
textfield_search_default_holo_light
tidak ada di R.drawable . Oleh karena itu, ini tidak mudah diakses melalui@android:drawable/textfield_search_default_holo_light
, yang dapat digunakan dalam selektor yang ditunjukkan di bawah, alih-alih merujuk drawable lokal.CATATAN: Saya menggunakan tema Holo Light sebagai dasar, tetapi Anda dapat melakukan hal yang sama dengan Holo Dark . Tampaknya tidak ada perbedaan nyata dalam memilih negara 9-patch antara Cahaya dan gelap tema. Namun, ada perbedaan dalam 9-patch untuk status default (lihat Terang vs Gelap ). Jadi, mungkin tidak perlu membuat salinan lokal 9-patch untuk status yang dipilih , untuk tema Gelap dan Terang (dengan asumsi Anda ingin menangani keduanya, dan membuat keduanya terlihat sama seperti di Tema Holo ). Cukup buat satu salinan lokal dan gunakan didrawable pemilih untuk kedua tema.
Sekarang, Anda harus mengedit sembilan-patch yang diunduh sesuai kebutuhan Anda (yaitu, mengubah warna biru menjadi merah). Anda dapat melihat file menggunakan alat draw 9-patch untuk memeriksa apakah sudah ditentukan dengan benar setelah Anda mengedit.
Saya telah mengedit file menggunakan GIMP dengan alat pensil satu piksel (cukup mudah) tetapi Anda mungkin akan menggunakan alat Anda sendiri. Inilah 9-patch saya yang disesuaikan untuk keadaan terfokus :
CATATAN: Untuk kesederhanaan, saya hanya menggunakan gambar untuk kepadatan mdpi . Anda harus membuat 9-patch untuk beberapa kepadatan layar jika Anda menginginkan hasil terbaik pada perangkat apa pun. Gambar untuk Holo
SearchView
dapat ditemukan dalam mdpi , hdpi , dan xhdpi drawable .Sekarang, kita perlu membuat pemilih drawable, sehingga gambar yang tepat ditampilkan berdasarkan status tampilan. Buat file
res/drawable/texfield_searchview_holo_light.xml
dengan konten berikut:Kami akan menggunakan drawable yang dibuat di atas untuk mengatur latar belakang untuk
LinearLayout
tampilan yang menampung bidang teks di dalamnyaSearchView
- id-nya adalahandroid:id/search_plate
. Jadi, inilah cara melakukan ini dengan cepat dalam kode, saat membuat menu opsi:Efek akhir
Berikut tangkapan layar dari hasil akhirnya:
Bagaimana saya bisa melakukan ini
Saya pikir ada baiknya mengukur bagaimana saya sampai ini, sehingga pendekatan ini dapat digunakan saat menyesuaikan tampilan lain.
Memeriksa tata letak tampilan
Saya telah memeriksa tampilan
SearchView
tata letak. Di kontraktor SearchView, seseorang dapat menemukan baris yang mengembangkan tata letak:Sekarang kita tahu bahwa
SearchView
layout dalam file bernamares/layout/search_view.xml
. Melihat ke dalam search_view.xml kita dapat menemukanLinearLayout
elemen dalam (dengan idsearch_plate
) yang adaandroid.widget.SearchView$SearchAutoComplete
di dalamnya (terlihat seperti bidang teks tampilan pencarian kita):Sekarang, kita sekarang latar belakang diatur berdasarkan
searchViewTextField
atribut tema saat ini .Investigasi atribut (apakah mudah diatur?)
Untuk memeriksa bagaimana
searchViewTextField
atribut disetel, kami menyelidiki res / values / themes.xml . Ada sekelompok atribut yang terkaitSearchView
secara defaultTheme
:Kami melihat bahwa untuk tema default nilainya adalah
@drawable/textfield_searchview_holo_dark
. UntukTheme.Light
nilai juga diatur dalam file itu .Sekarang, akan sangat bagus jika atribut ini dapat diakses melalui R.styleable , tetapi sayangnya tidak. Sebagai perbandingan, lihat atribut tema lain yang ada di themes.xml dan R.attr seperti textAppearance atau selectableItemBackground . Jika
searchViewTextField
ada diR.attr
(danR.stylable
) kami cukup menggunakan pemilih drawable kami saat menentukan tema untuk seluruh aplikasi kami dalam XML. Sebagai contoh:Apa yang harus diubah?
Sekarang kita tahu, bahwa kita harus mengakses
search_plate
melalui kode. Namun, kami masih belum tahu bagaimana seharusnya tampilannya. Singkatnya, kami mencari drawable yang digunakan sebagai nilai dalam tema default: textfield_searchview_holo_dark.xml dan textfield_searchview_holo_light.xml . Melihat konten, kita melihat bahwa drawableselector
merujuk pada dua drawable lainnya (yang nantinya merupakan 9-patch) berdasarkan status tampilan. Anda dapat menemukan agregat 9-patch drawable dari (hampir) semua versi Android di androiddrawables.comMenyesuaikan
Kami mengenali garis biru di salah satu dari 9-patch , jadi kami membuat salinan lokalnya dan mengubah warna sesuai keinginan.
sumber
SearchView
dirinya sendiri). Bolehkah saya menggabungkan jawaban Anda (menimpa onCreateOptionsMenu) ke dalam jawaban saya?onCreate()
metode keonCreateOptionsMenu()
metode seperti yang Anda sarankan. Beri suara untuk jawaban Anda.Solusi di atas mungkin tidak berfungsi jika Anda menggunakan pustaka appcompat. Anda mungkin harus mengubah kode agar berfungsi untuk pustaka appcompat.
Berikut adalah solusi yang berfungsi untuk pustaka appcompat.
sumber
onCreateOptionsMenu
Metode Anda harus:di mana item pencarian Anda
menu_search
keluar jalurdan inilah
searchviewredversion
(yang ini adalah versi xhdpi): http://img836.imageshack.us/img836/5964/searchviewredversion.pngsumber
Solusi di atas tidak berfungsi dengan ActionBarSherlock 4.2 dan oleh karena itu tidak kompatibel dengan Android 2.x. Berikut adalah kode kerja yang menyiapkan latar belakang SearchView dan teks petunjuk di ActionBarSherlock 4.2:
sumber
Saya lelah melakukan ini juga dan saya menggunakan v7. Aplikasi macet ketika saya mencoba mengambil
searchPlate
viagetIdentifier()
jadi saya melakukannya dengan cara ini:sumber
Saya juga menghadapi masalah yang sama. Saya menggunakan pustaka appcompat v7 dan menentukan gaya khusus untuknya. Di folder drawable, letakkan file bottom_border.xml yang terlihat seperti ini:
Dalam folder nilai styles_myactionbartheme.xml:
Saya mendefinisikan file custommenu.xml untuk menampilkan menu:
Aktivitas Anda harus memperluas ActionBarActivity, bukan Activity.
Dalam file manifes:
Untuk informasi lebih lanjut lihat di sini:
Di sini http://www.jayway.com/2014/06/02/android-theming-the-actionbar/
sumber
Memperbarui
Jika Anda menggunakan AndroidX, Anda dapat melakukannya seperti ini
sumber
Pertama, mari buat file XML bernama search_widget_background.xml, untuk digunakan sebagai drawable, yaitu di bawah direktori drawable.
Drawable ini akan digunakan sebagai latar belakang widget pencarian kita. Saya mengatur warna menjadi merah karena itulah yang Anda minta, tetapi Anda dapat mengaturnya ke warna apa pun yang ditentukan oleh tag @color. Anda bahkan dapat memodifikasinya lebih lanjut menggunakan atribut yang ditentukan untuk tag bentuk (membuat sudut membulat, membuat latar belakang oval, dll.).
Langkah selanjutnya adalah mengatur latar belakang widget pencarian kita ke widget ini. Ini dapat dicapai dengan yang berikut:
sumber
SearchView
(bernamasearch_plate
), bukan padaSearchView
dirinya sendiri. Lihat jawaban saya untuk lebih jelasnya. Namun harus saya akui, saya belum mencoba menggunakan jawaban @ (baba tenor).SearchView
dirinya sendiri akan selalu berada di bawah latar belakang untuk elemen yang ada di dalamnyaSearchView
. AdaLinearLayout
tampilan di dalamnyaSearchView
yang memiliki idsearch_plate
, set tersebut memiliki elemen garis bawah biru sebagai latar belakang. Lihat jawaban saya untuk detailnya. Jadi dengan solusi Anda, hasilnya adalah latar belakang biru untuk seluruh widget dengan garis bawah biru masih terlihat. Saya telah menguji Jelly Bean , tetapi menurut saya versi target SDK tidak penting di sini.dan ini adalah file searchablecolor.xml
sumber
Saya menjelaskan di akhir posting ini dengan gambar ini berlaku untuk formulir xamarin. Tetapi saya pikir Anda bisa memahaminya, karena ini didasarkan pada kode sumber dari tampilan pencarian android
Bagaimana mengubah gambar tombol batal searchbar dalam bentuk xamarin
sumber
Jika Anda meluaskan Searchview seperti ini "getMenuInflater (). Inflate (R.menu.search_menu, menu);". Kemudian Anda dapat menyesuaikan tampilan pencarian ini melalui style.xml seperti di bawah ini.
sumber
Saya banyak menggali tentang itu dan akhirnya saya menemukan solusi ini dan itu berhasil untuk saya!
Anda bisa menggunakan ini
Jika Anda menggunakan appcompat coba ini:
Jika Anda menggunakan androidx coba ini:
Ini akan mengubah ikon tampilan layar default.
Semoga membantu!
sumber