मैं एक आईसीएस ऐप में holo.light विषय के साथ एक मानक स्विच नियंत्रण का उपयोग कर रहा हूं।
मैं टॉगल बटन के हाइलाइटेड या स्टेट कलर को स्टैंडर्ड लाइट ब्लू से ग्रीन में बदलना चाहता हूं।
यह आसान होना चाहिए, लेकिन मैं यह नहीं कर सकता कि यह कैसे करना है।
मैं एक आईसीएस ऐप में holo.light विषय के साथ एक मानक स्विच नियंत्रण का उपयोग कर रहा हूं।
मैं टॉगल बटन के हाइलाइटेड या स्टेट कलर को स्टैंडर्ड लाइट ब्लू से ग्रीन में बदलना चाहता हूं।
यह आसान होना चाहिए, लेकिन मैं यह नहीं कर सकता कि यह कैसे करना है।
जवाबों:
अब के रूप में यह AppCompat.v7 पुस्तकालय से SwitchCompat का उपयोग करने के लिए बेहतर है। फिर आप अपने घटकों के रंग को बदलने के लिए साधारण स्टाइलिंग का उपयोग कर सकते हैं।
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>
रेफरी: Android डेवलपर्स ब्लॉग
संपादित करें :
जिस तरीके से इसे सही तरीके से लागू किया जाना चाहिए वह माध्यम है android:theme="@style/Theme.MyTheme"
और यह माता-पिता की शैलियों जैसे एडिटेक्स, रेडियोबटन, स्विच, चेकबॉक्स और प्रोग्रेसबर्स पर भी लागू किया जा सकता है:
<style name="My.Widget.ProgressBar" parent="Widget.AppCompat.ProgressBar">
<style name="My.Widget.Checkbox" parent="Widget.AppCompat.CompoundButton.CheckBox">
colorAccent
, 'ऑफ' है colorSwitchThumbNormal
। यदि AppCompat
थीम का उपयोग कर रहे हैं , तो आपको SwitchCompat
इसके बजाय उपयोग करने की आवश्यकता है Switch
। यदि एसडीके 23+ का उपयोग कर रहे हैं, तो आप उपयोग कर सकते हैं android:thumbTint
और android:thumbTintMode
ए के साथ ColorStateList
।
पार्टी करने के लिए देर हो रही है लेकिन मैंने ऐसा किया है
अंदाज
<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>
रंग की
ख़ाका
<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" />
परिणाम
सक्षम और अक्षम स्विच के लिए रंगों का परिवर्तन देखें
SwitchCompat
;)
यह मेरे लिए काम कर रहा है (Android 4.1 की आवश्यकता है):
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);
ध्यान दें कि "डिफ़ॉल्ट" स्थिति को अंतिम रूप में जोड़ा जाना चाहिए जैसा कि यहां दिखाया गया है।
एकमात्र समस्या जो मुझे दिखाई देती है वह यह है कि स्विच का "अंगूठा" अब पृष्ठभूमि से बड़ा या स्विच का "ट्रैक" प्रतीत होता है। मुझे लगता है कि क्योंकि मैं अभी भी डिफ़ॉल्ट ट्रैक छवि का उपयोग कर रहा हूं, जिसके चारों ओर कुछ खाली जगह है। हालाँकि, जब मैंने इस तकनीक का उपयोग करके ट्रैक इमेज को कस्टमाइज़ करने का प्रयास किया, तो मेरे स्विच में 1 / पिक्सेल की ऊँचाई दिखाई दी, जिसमें टेक्स्ट के दिखने / बंद होने का सिर्फ एक स्लिवर था। उस के लिए एक समाधान होना चाहिए, लेकिन मैं इसे अभी तक नहीं मिला है ...
Android 5 के लिए अपडेट करें
एंड्रॉइड 5 में, ऊपर का कोड स्विच को पूरी तरह से गायब कर देता है। हमें नए का उपयोग करने में सक्षम होना चाहिए सेटबटनटाइटलिस्ट पद्धति , लेकिन स्विच के लिए इसे नजरअंदाज किया जाना चाहिए। लेकिन यह काम करता है:
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 के लिए अपडेट करें
जैसा कि चेरुबी ने टिप्पणियों में कहा था, हम नए का उपयोग कर सकते हैं setThumbTintList
और जो मेरे लिए उम्मीद के मुताबिक काम किया है। हम उपयोग भी कर सकते हैं setTrackTintList
, लेकिन यह रंग को एक मिश्रण के रूप में लागू करता है, जिसके परिणामस्वरूप गहरे रंग के विषयों में अपेक्षा से अधिक गहरा और हल्के रंग के विषयों में अपेक्षा से हल्का होता है, कभी-कभी अदृश्य होने के बिंदु पर। एंड्रॉइड 7 में, मैं ट्रैक टिंट मोड को ओवरराइड करके उस परिवर्तन को कम करने में सक्षम था , लेकिन मुझे एंड्रॉइड 6 में उस से अच्छे परिणाम नहीं मिल सके। आपको अतिरिक्त रंगों को परिभाषित करने की आवश्यकता हो सकती है जो सम्मिश्रण के लिए क्षतिपूर्ति करते हैं। (क्या आपको कभी यह एहसास होता है कि Google नहीं चाहता है कि हम अपने ऐप्स की उपस्थिति को कस्टमाइज़ करें?)
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);
लिए भी काम करता है। API 21-22: @Alexey द्वारा सुझाए गए ड्राएबल.कॉम का उपयोग करें। switchInput.setButtonTintList(buttonStates);
मेरे लिए काम नहीं किया है, यह मेरी स्विच के लिए राज्यों को रंग नहीं किया। 21 से नीचे का एपीआई: switchInput.getThumbDrawable().setColorFilter(someColor, PorterDuff.Mode.SrcIn);
ये मेरे लिए काम करते हैं। मैंने Xamarin के साथ भी काम किया है, इसलिए यदि आप Xamarin.Forms का उपयोग करते हैं, तो एंड्रॉइड रेंडरर्स में C # में अनुवाद करें।
Style.xml या Java कोड का उपयोग किए बिना स्विच शैली को बदलने के लिए, आप लेआउट XML में स्विच को अनुकूलित कर सकते हैं:
<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" />
यह विशेषता है android: thumbTint और android: trackTint जिसने आपको रंग अनुकूलित करने की अनुमति दी है
यह इस XML के लिए दृश्य परिणाम है:
app:thumbTint
इसके बजाय उपयोग करें android:thumbTint
और switch
साथ बदलेंSwitchCompat
रंग बदलने के लिए एक कस्टम स्विच बनाएं और ओवरराइड सेट करें:
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 द्वारा उत्तर सही है, क्या वास्तव में इस सवाल का जवाब नहीं दिया गया है कि "" ऑन "रंग को कैसे सेट किया जाए, अन्य विगेट्स को भी प्रभावित किए बिना। ऐसा करने के लिए, ThemeOverlay
style.xml में एक का उपयोग करें :
<style name="ToggleSwitchTheme" parent="ThemeOverlay.AppCompat.Light">
<item name="colorAccent">@color/green_bright</item>
</style>
और इसे अपने स्विच में देखें:
<android.support.v7.widget.SwitchCompat
android:theme="@style/ToggleSwitchTheme" ... />
ऐसा करने में यह केवल उन विचारों के रंग को प्रभावित करेगा जिन्हें आप इसे लागू करना चाहते हैं।
<androidx.appcompat.widget.SwitchCompat
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:thumbTint="@color/white"
app:trackTint="@drawable/checker_track"/>
और अंदर checker_track.xml:
<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
केवल Android API 21 और इसके बाद के संस्करण पर लागू होता है। अगर मैं एंड्रॉइड 21 के नीचे का रंग बदलना चाहता हूं तो कैसे करूं?
जब स्विच स्थिति बदली गई थी, तो मैंने कलर फिल्टर को अपडेट करके इसे हल किया ...
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);
}
}
बनाने योग्य "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>
और बनाने योग्य "newtrack.xml"
<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>
और इसे स्विच में जोड़ें:
<Switch
android:trackTint="@drawable/newtrack"
android:thumbTint="@drawable/newthumb"
/>
trackTint
या thumbTint
। इसे मैन्युअल रूप से लिखने की आवश्यकता है और यह काम करता है।
Android लॉलीपॉप और इसके बाद के संस्करण में, इसे अपनी थीम शैली में परिभाषित करें:
<style name="BaseAppTheme" parent="Material.Theme">
...
<item name="android:colorControlActivated">@color/color_switch</item>
</style>
अपनी खुद की 9-पैच छवि बनाएं और इसे टॉगल बटन की पृष्ठभूमि के रूप में सेट करें।
अर्लोमेडिया से सुझाए गए समाधान ने मेरे लिए काम किया। एक्स्ट्रास्पेस के अपने मुद्दे के बारे में मैंने हल करने के लिए सभी पैडिंग को हटा दिया।
संपादित करें
जैसा कि अनुरोध किया गया है, यहाँ मेरे पास क्या है।
लेआउट फ़ाइल में, मेरा स्विच एक रेखीय लेआउट के अंदर है और एक TextView के बाद है।
<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) के साथ काम कर रहा हूं, मेरा कोड है:
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 को पहले इस तरह परिभाषित किया गया है (Xamarin):
Switch swtch_EnableEdit = view.FindViewById<Switch>(Resource.Id.mySwitch);
मैं सभी पैडिंग में सेट नहीं हूं और मैं .setPadding (0, 0, 0, 0) को कॉल नहीं करता हूं।
आप स्विच विजेट के लिए कस्टम शैली बना सकते हैं जो रंग उच्चारण का उपयोग डिफ़ॉल्ट रूप से करते हैं जब इसके लिए कस्टम शैली करते हैं
<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>
आप स्विच बटन के लिए रंग बदलने के लिए आसान इस काम की कोशिश कर सकते हैं।
https://github.com/kyleduo/SwitchButton
यहां सही उत्तर जानने का प्रयास करें: TextView की पृष्ठभूमि रंग पर चयनकर्ता । दो शब्दों में आपको रंग के साथ XML में आकार बनाना चाहिए और फिर इसे अपने चयनकर्ता को "चेक" करने के लिए निर्दिष्ट करना चाहिए।
सबसे आसान तरीका ट्रैक टिंट को परिभाषित करना है, और 30% पारदर्शिता को हटाने के लिए src_over को टिंट मोड सेट करना है।
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>
मौजूदा उत्तरों के अतिरिक्त: आप अंगूठे का चयन कर सकते हैं और चयनकर्ताओं का उपयोग करके ट्रैक कर सकते हैं res/color
फ़ोल्डर , उदाहरण के लिए:
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>
ट्रैक और अंगूठे के निशान को अनुकूलित करने के लिए इन चयनकर्ताओं का उपयोग करें:
<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"/>
ध्यान रखें कि यदि आप इन विशेषताओं के लिए standart Switch
और android
नाम स्थान का उपयोग करते हैं , तो यह केवल एपीआई 23 और बाद के लिए काम करेगा, इसलिए नाम स्थान के SwitchCompat
साथ उपयोग करेंapp
xmlns:app="http://schemas.android.com/apk/res-auto"
सार्वभौमिक समाधान के रूप में ।
परिणाम:
Xml में, आप निम्नानुसार रंग बदल सकते हैं:
<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"/>
गतिशील रूप से आप इसे बदल सकते हैं:
Switch.thumbDrawable.setColorFilter(ContextCompat.getColor(requireActivity(), R.color.darkBlue), PorterDuff.Mode.MULTIPLY)
Android Studio 3.6 के लिए समाधान:
yourSwitch.setTextColor(getResources().getColor(R.color.yourColor));
रंग XML फ़ाइल परिभाषित मूल्य (yourColor) में पाठ का रंग बदलता है।
Switch
इस कस्टम चयनकर्ता को बाद में इंगित करना न भूलें ।