Bir ICS uygulamasında holo.light temasıyla standart bir Switch kontrolü kullanıyorum.
Geçiş Düğmesinin vurgulanan veya açık durum rengini standart açık maviden yeşile değiştirmek istiyorum.
Bu kolay olmalı, ama nasıl yapılacağını anlayamıyorum.
Bir ICS uygulamasında holo.light temasıyla standart bir Switch kontrolü kullanıyorum.
Geçiş Düğmesinin vurgulanan veya açık durum rengini standart açık maviden yeşile değiştirmek istiyorum.
Bu kolay olmalı, ama nasıl yapılacağını anlayamıyorum.
Yanıtlar:
Şu andan itibaren AppCompat.v7 kütüphanesinden SwitchCompat'ı kullanmak daha iyidir. Ardından, bileşenlerinizin rengini değiştirmek için basit bir stil kullanabilirsiniz.
values/themes.xml:
<style name="Theme.MyTheme" parent="Theme.AppCompat.Light">
<!-- colorPrimary is used for the default action bar background -->
<item name="colorPrimary">@color/my_awesome_color</item>
<!-- colorPrimaryDark is used for the status bar -->
<item name="colorPrimaryDark">@color/my_awesome_darker_color</item>
<!-- colorAccent is used as the default value for colorControlActivated,
which is used to tint widgets -->
<item name="colorAccent">@color/accent</item>
<!-- You can also set colorControlNormal, colorControlActivated
colorControlHighlight, and colorSwitchThumbNormal. -->
</style>
ref: Android Geliştiricileri Blogu
DÜZENLE :
Doğru bir şekilde uygulanması gereken yöntemdir android:theme="@style/Theme.MyTheme"
ve ayrıca EditTexts, RadioButtons, Switchler, CheckBoxes ve ProgressBars gibi üst stillere uygulanabilir:
<style name="My.Widget.ProgressBar" parent="Widget.AppCompat.ProgressBar">
<style name="My.Widget.Checkbox" parent="Widget.AppCompat.CompoundButton.CheckBox">
colorAccent
, 'kapalı' colorSwitchThumbNormal
. AppCompat
Temayı kullanıyorsanız, SwitchCompat
yerine kullanmanız gerekir Switch
. SDK 23+ kullanıyorsanız, android:thumbTint
ve android:thumbTintMode
ile birlikte kullanabilirsiniz ColorStateList
.
Partiye geç kaldım ama işte böyle yaptım
stil
<style name="SCBSwitch" parent="Theme.AppCompat.Light">
<!-- active thumb & track color (30% transparency) -->
<item name="colorControlActivated">#46bdbf</item>
<!-- inactive thumb color -->
<item name="colorSwitchThumbNormal">#f1f1f1
</item>
<!-- inactive track color (30% transparency) -->
<item name="android:colorForeground">#42221f1f
</item>
</style>
Renkler
Yerleşim
<android.support.v7.widget.SwitchCompat
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:checked="false"
android:theme="@style/SCBSwitch" />
Sonuç
Etkinleştirme ve devre dışı bırakma anahtarı için renk değişikliğine bakın
SwitchCompat
;)
Bu benim için çalışıyor (Android 4.1 gerektirir):
Switch switchInput = new Switch(this);
int colorOn = 0xFF323E46;
int colorOff = 0xFF666666;
int colorDisabled = 0xFF333333;
StateListDrawable thumbStates = new StateListDrawable();
thumbStates.addState(new int[]{android.R.attr.state_checked}, new ColorDrawable(colorOn));
thumbStates.addState(new int[]{-android.R.attr.state_enabled}, new ColorDrawable(colorDisabled));
thumbStates.addState(new int[]{}, new ColorDrawable(colorOff)); // this one has to come last
switchInput.setThumbDrawable(thumbStates);
"Varsayılan" durumun burada gösterildiği gibi son olarak eklenmesi gerektiğini unutmayın.
Gördüğüm tek sorun, anahtarın "baş parmağı" artık anahtarın arka planından veya "izinden" daha büyük görünmesidir. Bence hala etrafında biraz boş alan olan varsayılan parça görüntüsünü kullanıyorum. Ancak, bu tekniği kullanarak parça görüntüsünü özelleştirmeye çalıştığımda, anahtarımın açık / kapalı metnin sadece bir şeridi görünecek şekilde 1 piksel yüksekliğe sahip gibi görünüyordu. Bunun için bir çözüm olmalı, ama henüz bulamadım ...
Android 5 için güncelleme
Android 5'te, yukarıdaki kod anahtarın tamamen kaybolmasını sağlar. Yeni setButtonTintList yöntemini kullanabilmeliyiz , ancak bu anahtarlar için yok sayılıyor gibi görünüyor. Ama bu işe yarıyor:
ColorStateList buttonStates = new ColorStateList(
new int[][]{
new int[]{-android.R.attr.state_enabled},
new int[]{android.R.attr.state_checked},
new int[]{}
},
new int[]{
Color.BLUE,
Color.RED,
Color.GREEN
}
);
switchInput.getThumbDrawable().setTintList(buttonStates);
switchInput.getTrackDrawable().setTintList(buttonStates);
Android 6-7 için güncelleme
Cheruby'nin yorumlarda belirttiği gibi, yenisini kullanabiliriz setThumbTintList
ve bu benim için beklendiği gibi çalıştı. Ayrıca kullanabiliriz setTrackTintList
, ancak bu, rengi koyu renk temalarında beklenenden daha koyu ve açık renk temalarında beklenenden daha hafif, bazen görünmez olma noktasına kadar bir karışım olarak uygular. Android 7'de, parça tonu modunu geçersiz kılarak bu değişikliği en aza indirebildim , ancak Android 6'dakinden iyi sonuçlar alamadım. Karışımı telafi eden ekstra renkler tanımlamanız gerekebilir. (Google'ın uygulamalarımızın görünümünü özelleştirmemizi istemediğini hissettiniz mi?)
ColorStateList thumbStates = new ColorStateList(
new int[][]{
new int[]{-android.R.attr.state_enabled},
new int[]{android.R.attr.state_checked},
new int[]{}
},
new int[]{
Color.BLUE,
Color.RED,
Color.GREEN
}
);
switchInput.setThumbTintList(thumbStates);
if (Build.VERSION.SDK_INT >= 24) {
ColorStateList trackStates = new ColorStateList(
new int[][]{
new int[]{-android.R.attr.state_enabled},
new int[]{}
},
new int[]{
Color.GRAY,
Color.LTGRAY
}
);
switchInput.setTrackTintList(trackStates);
switchInput.setTrackTintMode(PorterDuff.Mode.OVERLAY);
}
switchInput.setThumbTintList(buttonStates);
Nougat için de çalışır. API 21-22: @Alexey tarafından önerildiği gibi DrawableCompat kullanın. switchInput.setButtonTintList(buttonStates);
Benim Switch durumları renklendirmek etmedi benim için çalışmadı. API 21'in altında: switchInput.getThumbDrawable().setColorFilter(someColor, PorterDuff.Mode.SrcIn);
Bunlar benim için çalıştı. Ben de Xamarin ile çalıştım, bu yüzden Xamarin.Forms kullanıyorsanız bunları Android oluşturucularda C #'ye çevirin.
Style.xml veya Java kodunu kullanmadan Switch stilini değiştirmek için, XML yerleşim düzenine geçişi özelleştirebilirsiniz:
<Switch
android:id="@+id/checkbox"
android:layout_width="wrap_content"
android:thumbTint="@color/blue"
android:trackTint="@color/white"
android:checked="true"
android:layout_height="wrap_content" />
Bu özellik android: thumbTint ve android: trackTint , rengi özelleştirmenizi sağlar
Bu XML için görsel sonuç şudur:
app:thumbTint
yerine android:thumbTint
ve değişim switch
ileSwitchCompat
Özel bir Anahtar oluşturun ve set override setRenk değişti:
public class SwitchPlus extends Switch {
public SwitchPlus(Context context) {
super(context);
}
public SwitchPlus(Context context, AttributeSet attrs) {
super(context, attrs);
}
public SwitchPlus(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
public void setChecked(boolean checked) {
super.setChecked(checked);
changeColor(checked);
}
private void changeColor(boolean isChecked) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
int thumbColor;
int trackColor;
if(isChecked) {
thumbColor = Color.argb(255, 253, 153, 0);
trackColor = thumbColor;
} else {
thumbColor = Color.argb(255, 236, 236, 236);
trackColor = Color.argb(255, 0, 0, 0);
}
try {
getThumbDrawable().setColorFilter(thumbColor, PorterDuff.Mode.MULTIPLY);
getTrackDrawable().setColorFilter(trackColor, PorterDuff.Mode.MULTIPLY);
}
catch (NullPointerException e) {
e.printStackTrace();
}
}
}
}
SubChord'un cevabı doğru olsa da, diğer widget'ları etkilemeden "açık" rengin nasıl ayarlanacağı sorusuna gerçekten cevap vermez. Bunu yapmak için ThemeOverlay
styles.xml dosyasında a kullanın :
<style name="ToggleSwitchTheme" parent="ThemeOverlay.AppCompat.Light">
<item name="colorAccent">@color/green_bright</item>
</style>
Ve anahtarınızda referans verin:
<android.support.v7.widget.SwitchCompat
android:theme="@style/ToggleSwitchTheme" ... />
Bunu yapmak, SADECE uygulamak istediğiniz görünümlerin rengini etkiler.
<androidx.appcompat.widget.SwitchCompat
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:thumbTint="@color/white"
app:trackTint="@drawable/checker_track"/>
Ve checker_track.xml içinde:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/lightish_blue" android:state_checked="true"/>
<item android:color="@color/hint" android:state_checked="false"/>
</selector>
thumbTint
yalnızca Android API 21 ve sonraki sürümleri için geçerlidir. Android 21'in altındaki rengi değiştirmek istersem nasıl olur?
Anahtar durumu değiştiğinde Renk Filtresini güncelleyerek çözdüm ...
public void bind(DetailItem item) {
switchColor(item.toggle);
listSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
switchColor(b);
}
});
}
private void switchColor(boolean checked) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
listSwitch.getThumbDrawable().setColorFilter(checked ? Color.BLACK : Color.WHITE, PorterDuff.Mode.MULTIPLY);
listSwitch.getTrackDrawable().setColorFilter(!checked ? Color.BLACK : Color.WHITE, PorterDuff.Mode.MULTIPLY);
}
}
çekilebilir hale getir "newthumb.xml"
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/Green" android:state_checked="true"/>
<item android:color="@color/Red" android:state_checked="false"/>
</selector>
ve çizilebilir "newtrack.xml" yap
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/black" android:state_checked="true"/>
<item android:color="@color/white" android:state_checked="false"/>
</selector>
ve Switch'e ekleyin:
<Switch
android:trackTint="@drawable/newtrack"
android:thumbTint="@drawable/newthumb"
/>
trackTint
veya için @ çekilebilir kaynaklar öneremeyeceğini belirtmek gerekir thumbTint
. Manuel olarak yazılması gerekiyor ve çalışıyor.
Android Lollipop ve üstü sürümlerde tema stilinizde tanımlayın:
<style name="BaseAppTheme" parent="Material.Theme">
...
<item name="android:colorControlActivated">@color/color_switch</item>
</style>
Kendi 9 yama görüntünüzü oluşturun ve seçim düğmesinin arka planı olarak ayarlayın.
Arlomedia'nın önerdiği çözüm benim için çalıştı. Ekstra alanı konusuyla ilgili olarak tüm dolguları anahtara çıkararak çözdüm.
DÜZENLE
İstendiği gibi, burada ne var.
Düzen dosyasında, anahtarım doğrusal bir düzen içinde ve bir TextView sonrasında.
<LinearLayout
android:id="@+id/myLinearLayout"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_gravity="center_horizontal|center"
android:gravity="right"
android:padding="10dp"
android:layout_marginTop="0dp"
android:background="@drawable/bkg_myLinearLayout"
android:layout_marginBottom="0dp">
<TextView
android:id="@+id/myTextForTheSwitch"
android:layout_height="wrap_content"
android:text="@string/TextForTheSwitch"
android:textSize="18sp"
android:layout_centerHorizontal="true"
android:layout_gravity="center_horizontal|center"
android:gravity="right"
android:layout_width="wrap_content"
android:paddingRight="20dp"
android:textColor="@color/text_white" />
<Switch
android:id="@+id/mySwitch"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textOn="@string/On"
android:textOff="@string/Off"
android:layout_centerHorizontal="true"
android:layout_gravity="center_horizontal"
android:layout_toRightOf="@id/myTextForTheSwitch"
android:layout_alignBaseline="@id/myTextForTheSwitch"
android:gravity="right" />
</LinearLayout>
Xamarin / Monodroid (min. Android 4.1) ile çalıştığım için kodum:
Android.Graphics.Color colorOn = Android.Graphics.Color.Green;
Android.Graphics.Color colorOff = Android.Graphics.Color.Gray;
Android.Graphics.Color colorDisabled = Android.Graphics.Color.Green;
StateListDrawable drawable = new StateListDrawable();
drawable.AddState(new int[] { Android.Resource.Attribute.StateChecked }, new ColorDrawable(colorOn));
drawable.AddState(new int[] { -Android.Resource.Attribute.StateEnabled }, new ColorDrawable(colorDisabled));
drawable.AddState(new int[] { }, new ColorDrawable(colorOff));
swtch_EnableEdit.ThumbDrawable = drawable;
swtch_EnableEdit daha önce şu şekilde tanımlanmıştır (Xamarin):
Switch swtch_EnableEdit = view.FindViewById<Switch>(Resource.Id.mySwitch);
Tüm dolguları ayarlamıyorum ve .setPadding (0, 0, 0, 0) çağırmıyorum.
bunun için özel stil yaparken varsayılan olarak renk aksanını kullanan anahtar widget'ı için özel stil yapabilirsiniz
<style name="switchStyle" parent="Theme.AppCompat.Light">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorPrimary</item> <!-- set your color -->
</style>
Anahtar düğmesinin rengini değiştirmek kolay olan bu lib'i deneyebilirsiniz.
https://github.com/kyleduo/SwitchButton
Burada doğru cevabı bulmaya çalışın: TextView'ın arka plan renginde seçici . İki kelimeyle XML'de Şekil'i renkle oluşturmalı ve daha sonra seçicinizde "işaretli" durumuna atamalısınız.
En kolay yol, parça tonunu tanımlamak ve% 30 şeffaflığı kaldırmak için ton modunu src_over olarak ayarlamaktır.
android:trackTint="@drawable/toggle_style"
android:trackTintMode="src_over"
toggle_style.xml
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/informationDefault"
android:state_checked="true"
/>
<item android:color="@color/textDisabled" android:state_checked="false"/>
</selector>
Mevcut cevaplara ek olarak: res/color
klasördeki seçicileri kullanarak başparmak ve parçayı özelleştirebilirsiniz , örneğin:
switch_track_selector
<?xml version="1.0" encoding="utf-8"?>
<selector
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/lightBlue"
android:state_checked="true" />
<item android:color="@color/grey"/>
</selector>
switch_thumb_selector
<selector
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/darkBlue"
android:state_checked="true" />
<item android:color="@color/white"/>
</selector>
Parça ve başparmak renk tonlarını özelleştirmek için bu seçicileri kullanın:
<androidx.appcompat.widget.SwitchCompat
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:trackTint="@color/switch_track_selector"
app:thumbTint="@color/switch_thumb_selector"/>
Bu özellikler için standart Switch
ve android
ad alanı kullanırsanız , yalnızca API 23 ve sonraki sürümlerde çalışacağını unutmayın, bu nedenle ad alanı SwitchCompat
ile kullanınapp
xmlns:app="http://schemas.android.com/apk/res-auto"
evrensel çözüm olarak.
Sonuç:
Xml'de rengi şu şekilde değiştirebilirsiniz:
<androidx.appcompat.widget.SwitchCompat
android:id="@+id/notificationSwitch"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:checked="true"
app:thumbTint="@color/darkBlue"
app:trackTint="@color/colorGrey"/>
Dinamik olarak şu şekilde değiştirebilirsiniz:
Switch.thumbDrawable.setColorFilter(ContextCompat.getColor(requireActivity(), R.color.darkBlue), PorterDuff.Mode.MULTIPLY)
Android Studio 3.6 için çözüm:
yourSwitch.setTextColor(getResources().getColor(R.color.yourColor));
Renk XML dosyası tanımlı değerinin (renginiz) içindeki a'nın metin rengini değiştirir.
Switch
sonra bu özel seçiciyi işaret etmeyi unutmayın .