SwitchPreference.java revision 94f67e2af607df29a1c47e43ef6570fea46aa2b4
1be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell/* 2be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * Copyright (C) 2010 The Android Open Source Project 3be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * 4be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * Licensed under the Apache License, Version 2.0 (the "License"); 5be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * you may not use this file except in compliance with the License. 6be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * You may obtain a copy of the License at 7be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * 8be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * http://www.apache.org/licenses/LICENSE-2.0 9be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * 10be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * Unless required by applicable law or agreed to in writing, software 11be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * distributed under the License is distributed on an "AS IS" BASIS, 12be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * See the License for the specific language governing permissions and 14be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * limitations under the License. 15be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell */ 16be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell 17be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powellpackage android.preference; 18be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell 19be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powellimport android.content.Context; 20be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powellimport android.content.res.TypedArray; 21be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powellimport android.util.AttributeSet; 22be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powellimport android.view.View; 23be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powellimport android.widget.Checkable; 24be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powellimport android.widget.CompoundButton; 25be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powellimport android.widget.Switch; 26be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell 27be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell/** 28be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * A {@link Preference} that provides a two-state toggleable option. 29be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * <p> 30be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * This preference will store a boolean into the SharedPreferences. 31be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * 32be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * @attr ref android.R.styleable#SwitchPreference_summaryOff 33be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * @attr ref android.R.styleable#SwitchPreference_summaryOn 34be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * @attr ref android.R.styleable#SwitchPreference_switchTextOff 35be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * @attr ref android.R.styleable#SwitchPreference_switchTextOn 36be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * @attr ref android.R.styleable#SwitchPreference_disableDependentsState 37be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell */ 38be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powellpublic class SwitchPreference extends TwoStatePreference { 39be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell // Switch text for on and off states 40be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell private CharSequence mSwitchOn; 41be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell private CharSequence mSwitchOff; 42be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell private final Listener mListener = new Listener(); 43be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell 4494f67e2af607df29a1c47e43ef6570fea46aa2b4Adam Powell private class Listener implements CompoundButton.OnCheckedChangeListener { 45be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell @Override 46be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 4794f67e2af607df29a1c47e43ef6570fea46aa2b4Adam Powell if (!callChangeListener(isChecked)) { 4894f67e2af607df29a1c47e43ef6570fea46aa2b4Adam Powell // Listener didn't like it, change it back. 4994f67e2af607df29a1c47e43ef6570fea46aa2b4Adam Powell // CompoundButton will make sure we don't recurse. 5094f67e2af607df29a1c47e43ef6570fea46aa2b4Adam Powell buttonView.setChecked(!isChecked); 5194f67e2af607df29a1c47e43ef6570fea46aa2b4Adam Powell return; 5294f67e2af607df29a1c47e43ef6570fea46aa2b4Adam Powell } 5394f67e2af607df29a1c47e43ef6570fea46aa2b4Adam Powell 54be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell SwitchPreference.this.setChecked(isChecked); 55be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell } 56be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell } 57be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell 58be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell /** 59be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * Construct a new SwitchPreference with the given style options. 60be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * 61be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * @param context The Context that will style this preference 62be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * @param attrs Style attributes that differ from the default 63be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * @param defStyle Theme attribute defining the default style options 64be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell */ 65be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell public SwitchPreference(Context context, AttributeSet attrs, int defStyle) { 66be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell super(context, attrs, defStyle); 67be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell 68be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell TypedArray a = context.obtainStyledAttributes(attrs, 69be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell com.android.internal.R.styleable.SwitchPreference, defStyle, 0); 70be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell setSummaryOn(a.getString(com.android.internal.R.styleable.SwitchPreference_summaryOn)); 71be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell setSummaryOff(a.getString(com.android.internal.R.styleable.SwitchPreference_summaryOff)); 72be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell setSwitchTextOn(a.getString( 73be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell com.android.internal.R.styleable.SwitchPreference_switchTextOn)); 74be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell setSwitchTextOff(a.getString( 75be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell com.android.internal.R.styleable.SwitchPreference_switchTextOff)); 76be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell setDisableDependentsState(a.getBoolean( 77be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell com.android.internal.R.styleable.SwitchPreference_disableDependentsState, false)); 78be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell a.recycle(); 79be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell } 80be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell 81be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell /** 82be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * Construct a new SwitchPreference with the given style options. 83be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * 84be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * @param context The Context that will style this preference 85be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * @param attrs Style attributes that differ from the default 86be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell */ 87be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell public SwitchPreference(Context context, AttributeSet attrs) { 88be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell this(context, attrs, com.android.internal.R.attr.switchPreferenceStyle); 89be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell } 90be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell 91be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell /** 92be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * Construct a new SwitchPreference with default style options. 93be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * 94be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * @param context The Context that will style this preference 95be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell */ 96be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell public SwitchPreference(Context context) { 97be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell this(context, null); 98be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell } 99be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell 100be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell @Override 101be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell protected void onBindView(View view) { 102be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell super.onBindView(view); 103be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell 104be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell View checkableView = view.findViewById(com.android.internal.R.id.switchWidget); 105be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell if (checkableView != null && checkableView instanceof Checkable) { 106be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell ((Checkable) checkableView).setChecked(mChecked); 1077650259a597dd24137420d32acc35efc44db381eSvetoslav Ganov 1087650259a597dd24137420d32acc35efc44db381eSvetoslav Ganov sendAccessibilityEvent(checkableView); 109be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell 110be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell if (checkableView instanceof Switch) { 111be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell final Switch switchView = (Switch) checkableView; 112be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell switchView.setTextOn(mSwitchOn); 113be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell switchView.setTextOff(mSwitchOff); 114be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell switchView.setOnCheckedChangeListener(mListener); 115be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell } 116be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell } 117be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell 118be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell syncSummaryView(view); 119be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell } 120be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell 121be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell /** 122be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * Set the text displayed on the switch widget in the on state. 123be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * This should be a very short string; one word if possible. 124be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * 125be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * @param onText Text to display in the on state 126be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell */ 127be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell public void setSwitchTextOn(CharSequence onText) { 128be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell mSwitchOn = onText; 129be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell notifyChanged(); 130be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell } 131be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell 132be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell /** 133be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * Set the text displayed on the switch widget in the off state. 134be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * This should be a very short string; one word if possible. 135be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * 136be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * @param offText Text to display in the off state 137be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell */ 138be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell public void setSwitchTextOff(CharSequence offText) { 139be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell mSwitchOff = offText; 140be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell notifyChanged(); 141be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell } 142be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell 143be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell /** 144be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * Set the text displayed on the switch widget in the on state. 145be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * This should be a very short string; one word if possible. 146be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * 147be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * @param resId The text as a string resource ID 148be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell */ 149be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell public void setSwitchTextOn(int resId) { 150be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell setSwitchTextOn(getContext().getString(resId)); 151be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell } 152be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell 153be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell /** 154be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * Set the text displayed on the switch widget in the off state. 155be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * This should be a very short string; one word if possible. 156be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * 157be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * @param resId The text as a string resource ID 158be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell */ 159be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell public void setSwitchTextOff(int resId) { 160be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell setSwitchTextOff(getContext().getString(resId)); 161be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell } 162be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell 163be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell /** 164be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * @return The text that will be displayed on the switch widget in the on state 165be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell */ 166be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell public CharSequence getSwitchTextOn() { 167be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell return mSwitchOn; 168be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell } 169be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell 170be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell /** 171be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * @return The text that will be displayed on the switch widget in the off state 172be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell */ 173be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell public CharSequence getSwitchTextOff() { 174be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell return mSwitchOff; 175be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell } 176be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell} 177