it-swarm-id.com

Gaya kotak centang Android

Saya baru mengenal Android dan saya mencoba mengatur gaya untuk semua kotak centang di aplikasi saya. Gaya aplikasi saya diatur ke Theme.Holo yang gelap dan saya ingin kotak centang pada tampilan daftar saya menjadi gaya Theme.Holo.Light. Saya tidak mencoba membuat gaya khusus. Kode di bawah ini sepertinya tidak berfungsi, tidak ada yang terjadi sama sekali. Saya perlu melakukan ini karena tampilan daftar saya memiliki tekstur kertas terang dan kotak centang dan teks kotak centang putih yang saya ingin gelap.

<style name="CustomActivityTheme" parent="@Android:style/Theme.Holo">
    <item name="Android:checkboxStyle">@style/customCheckBoxStyle</item>
</style>

<style name="customCheckBoxStyle" parent="@Android:style/Widget.Holo.Light.CompoundButton.CheckBox">
</style>

Anda juga dapat mengatur gaya ke widget individual jika Anda menetapkan gaya ke aplikasi?

39
user1330739

Note: Menggunakan Android Support Library v22.1.0 dan menargetkan API level 11 ke atas? Gulir ke bawah ke pembaruan terakhir.


Gaya aplikasi saya diatur ke Theme.Holo yang gelap dan saya akan seperti kotak centang pada tampilan daftar saya menjadi Theme style.Holo.Light . Saya tidak mencoba membuat gaya khusus. Kode di bawah ini sepertinya tidak untuk bekerja, tidak ada yang terjadi sama sekali.

Pada awalnya mungkin tidak jelas mengapa sistem menunjukkan perilaku ini, tetapi ketika Anda benar-benar melihat ke mekanika Anda dapat dengan mudah menyimpulkannya. Biarkan saya membawa Anda melewatinya langkah demi langkah.

Pertama, mari kita lihat apa yang didefinisikan oleh gaya Widget.Holo.Light.CompoundButton.CheckBox. Agar lebih jelas, saya juga menambahkan definisi gaya 'biasa' (non-cahaya).

<style name="Widget.Holo.Light.CompoundButton.CheckBox" parent="Widget.CompoundButton.CheckBox" />

<style name="Widget.Holo.CompoundButton.CheckBox" parent="Widget.CompoundButton.CheckBox" />

Seperti yang Anda lihat, keduanya adalah deklarasi kosong yang hanya membungkus Widget.CompoundButton.CheckBox dengan nama yang berbeda. Jadi mari kita lihat gaya orang tua itu.

<style name="Widget.CompoundButton.CheckBox">
    <item name="Android:background">@Android:drawable/btn_check_label_background</item>
    <item name="Android:button">?android:attr/listChoiceIndicatorMultiple</item>
</style>

Gaya ini merujuk latar belakang dan tombol yang dapat digambar. btn_check_label_background hanyalah 9-tambalan dan karenanya tidak terlalu menarik sehubungan dengan masalah ini. Namun, ?android:attr/listChoiceIndicatorMultiple menunjukkan bahwa beberapa atribut berdasarkan tema saat ini (ini penting untuk disadari) akan menentukan tampilan sebenarnya dari CheckBox.

Karena listChoiceIndicatorMultiple adalah atribut tema, Anda akan menemukan beberapa deklarasi untuk itu - satu untuk setiap tema (atau tidak ada jika diwariskan dari tema induk). Ini akan terlihat sebagai berikut (dengan atribut lain dihilangkan untuk kejelasan):

<style name="Theme">
    <item name="listChoiceIndicatorMultiple">@Android:drawable/btn_check</item>
    ...
</style>

<style name="Theme.Holo">
    <item name="listChoiceIndicatorMultiple">@Android:drawable/btn_check_holo_dark</item>
    ...
</style>

<style name="Theme.Holo.Light" parent="Theme.Light">
    <item name="listChoiceIndicatorMultiple">@Android:drawable/btn_check_holo_light</item>
    ...
</style>

Jadi di sinilah keajaiban sesungguhnya terjadi: berdasarkan atribut listChoiceIndicatorMultiple tema, penampilan sebenarnya dari CheckBox ditentukan. Fenomena yang Anda lihat sekarang mudah dijelaskan: karena penampilannya berbasis tema (dan bukan berbasis gaya, karena itu hanyalah definisi kosong) dan Anda mewarisi dari Theme.Holo, Anda akan selalu mendapatkan Penampilan CheckBox cocok dengan tema.

Sekarang, jika Anda ingin mengubah penampilan CheckBox Anda menjadi versi Holo.Light, Anda perlu mengambil salinan sumber daya tersebut, menambahkannya ke aset lokal Anda dan menggunakan gaya khusus untuk menerapkannya.

Adapun pertanyaan kedua Anda:

Anda juga dapat mengatur gaya ke widget individual jika Anda menetapkan gaya ke aplikasi?

Tentu saja, dan mereka akan mengesampingkan gaya aktivitas atau set aplikasi apa pun.

Apakah ada cara untuk mengatur tema (gaya dengan gambar) ke kotak centang widget. (...) Apakah ada cara lain untuk menggunakan pemilih ini: tautan ?


Perbarui:

Mari saya mulai dengan mengatakan lagi bahwa Anda tidak seharusnya bergantung pada sumber daya internal Android. Ada alasan mengapa Anda tidak bisa hanya mengakses namespace internal sesuka Anda.

Namun, cara untuk mengakses sumber daya sistem adalah dengan melakukan pencarian id berdasarkan nama. Pertimbangkan potongan kode berikut:

int id = Resources.getSystem().getIdentifier("btn_check_holo_light", "drawable", "Android");
((CheckBox) findViewById(R.id.checkbox)).setButtonDrawable(id);

Baris pertama sebenarnya akan mengembalikan id sumber daya dari sumber yang dapat ditarik btn_check_holo_light. Karena kami telah menetapkan sebelumnya bahwa ini adalah pemilih tombol yang menentukan tampilan CheckBox, kami dapat mengaturnya sebagai 'tombol yang dapat digambar' pada widget. Hasilnya adalah CheckBox dengan tampilan versi Holo.Light, apa pun tema/gaya yang Anda tetapkan pada aplikasi, aktivitas, atau widget dalam xml. Karena ini hanya menetapkan tombol yang dapat digambar, Anda perlu mengubah gaya lainnya secara manual; misalnya sehubungan dengan penampilan teks.

Di bawah screenshot yang menunjukkan hasilnya. Kotak centang atas menggunakan metode yang dijelaskan di atas (saya secara manual mengatur warna teks menjadi hitam dalam xml), sedangkan yang kedua menggunakan gaya Holo berbasis tema default (non-cahaya, yaitu).

Screenshot showing the result


Pembaruan2:

Dengan pengenalan Perpustakaan Dukungan v22.1.0 , semuanya menjadi lebih mudah! Kutipan dari catatan rilis (penekanan saya):

Lollipop menambahkan kemampuan untuk menimpa tema pada tampilan demi tampilan dengan menggunakan atribut XML Android:theme - sangat berguna untuk hal-hal seperti bilah tindakan gelap pada aktivitas ringan. Sekarang, AppCompat memungkinkan Anda untuk menggunakan Android:theme untuk Toolbars (mencabut app:theme yang digunakan sebelumnya) dan, bahkan lebih baik, membawa dukungan Android:theme ke semua tampilan di perangkat API 11+.

Dengan kata lain: Anda sekarang dapat menerapkan tema berdasarkan per-view, yang membuat penyelesaian masalah asli jauh lebih mudah: cukup tentukan tema yang ingin Anda terapkan untuk tampilan yang relevan. Yaitu. dalam konteks pertanyaan awal, bandingkan hasil di bawah ini:

<CheckBox
    ...
    Android:theme="@Android:style/Theme.Holo" />

<CheckBox
    ...
    Android:theme="@Android:style/Theme.Holo.Light" />

CheckBox pertama ditata seolah-olah digunakan dalam tema gelap, yang kedua seolah-olah dalam tema terang, terlepas dari tema aktual yang ditetapkan untuk aktivitas atau aplikasi Anda.

Tentu saja Anda seharusnya tidak lagi menggunakan tema Holo, melainkan menggunakan Materi.

116
MH.

Mungkin ini akan memuaskan Anda - 

something.xml

<CheckBox
    Android:text="Custom CheckBox"
    Android:button="@drawable/checkbox_selector"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"/>

Pemilih

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:state_checked="true" Android:drawable="@drawable/star_down" />
    <item Android:state_checked="false" Android:drawable="@drawable/star" />
</selector>

Untuk, referensi cukup merujuk sini

56
Praveenkumar

Cara yang benar untuk melakukannya untuk desain Material adalah: 

Gaya:

<style name="MyCheckBox" parent="Theme.AppCompat.Light">  
    <item name="colorControlNormal">@color/foo</item>
    <item name="colorControlActivated">@color/bar</item>
</style>  

Tata letak:

<CheckBox  
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:checked="true"
    Android:text="Check Box"
    Android:theme="@style/MyCheckBox"/>

Ini akan menjaga animasi Material di Lollipop +.

21
Rémy DAVID

Mungkin Anda menginginkan sesuatu seperti:

<style name="CustomActivityTheme" parent="@Android:style/Theme.Holo">
    <item name="Android:checkboxStyle">@style/customCheckBoxStyle</item>
</style>

<style name="customCheckBoxStyle" parent="@Android:style/Widget.CompoundButton.CheckBox">
    <item name="Android:textColor">@Android:color/black</item>
</style>

Catatan, item textColor.

4
Edwin Evans

Di jawaban sebelumnya juga di bagian <selector>...</selector> Anda mungkin perlu:

<item Android:state_pressed="true" Android:drawable="@drawable/checkbox_pressed" ></item>
0
Alex Che