SwitchPreference.java revision be0a4535053bbfdebd215e244b154ac810fd8edc
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 44be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell private class Listener implements View.OnClickListener, CompoundButton.OnCheckedChangeListener { 45be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell @Override 46be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell public void onClick(View v) { 47be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell SwitchPreference.this.onClick(); 48be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell } 49be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell 50be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell @Override 51be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 52be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell SwitchPreference.this.setChecked(isChecked); 53be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell } 54be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell } 55be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell 56be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell /** 57be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * Construct a new SwitchPreference with the given style options. 58be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * 59be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * @param context The Context that will style this preference 60be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * @param attrs Style attributes that differ from the default 61be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * @param defStyle Theme attribute defining the default style options 62be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell */ 63be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell public SwitchPreference(Context context, AttributeSet attrs, int defStyle) { 64be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell super(context, attrs, defStyle); 65be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell 66be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell TypedArray a = context.obtainStyledAttributes(attrs, 67be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell com.android.internal.R.styleable.SwitchPreference, defStyle, 0); 68be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell setSummaryOn(a.getString(com.android.internal.R.styleable.SwitchPreference_summaryOn)); 69be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell setSummaryOff(a.getString(com.android.internal.R.styleable.SwitchPreference_summaryOff)); 70be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell setSwitchTextOn(a.getString( 71be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell com.android.internal.R.styleable.SwitchPreference_switchTextOn)); 72be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell setSwitchTextOff(a.getString( 73be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell com.android.internal.R.styleable.SwitchPreference_switchTextOff)); 74be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell setDisableDependentsState(a.getBoolean( 75be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell com.android.internal.R.styleable.SwitchPreference_disableDependentsState, false)); 76be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell a.recycle(); 77be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell } 78be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell 79be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell /** 80be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * Construct a new SwitchPreference with the given style options. 81be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * 82be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * @param context The Context that will style this preference 83be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * @param attrs Style attributes that differ from the default 84be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell */ 85be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell public SwitchPreference(Context context, AttributeSet attrs) { 86be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell this(context, attrs, com.android.internal.R.attr.switchPreferenceStyle); 87be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell } 88be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell 89be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell /** 90be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * Construct a new SwitchPreference with default style options. 91be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * 92be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * @param context The Context that will style this preference 93be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell */ 94be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell public SwitchPreference(Context context) { 95be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell this(context, null); 96be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell } 97be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell 98be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell @Override 99be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell protected void onBindView(View view) { 100be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell super.onBindView(view); 101be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell 102be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell View checkableView = view.findViewById(com.android.internal.R.id.switchWidget); 103be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell if (checkableView != null && checkableView instanceof Checkable) { 104be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell ((Checkable) checkableView).setChecked(mChecked); 105be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell 106be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell sendAccessibilityEventForView(checkableView); 107be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell 108be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell if (checkableView instanceof Switch) { 109be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell final Switch switchView = (Switch) checkableView; 110be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell switchView.setTextOn(mSwitchOn); 111be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell switchView.setTextOff(mSwitchOff); 112be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell switchView.setOnCheckedChangeListener(mListener); 113be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell } 114be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell 115be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell if (checkableView.hasFocusable()) { 116be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell // This is a focusable list item. Attach a click handler to toggle the button 117be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell // for the rest of the item. 118be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell view.setOnClickListener(mListener); 119be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell } 120be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell } 121be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell 122be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell syncSummaryView(view); 123be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell } 124be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell 125be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell /** 126be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * Set the text displayed on the switch widget in the on state. 127be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * This should be a very short string; one word if possible. 128be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * 129be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * @param onText Text to display in the on state 130be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell */ 131be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell public void setSwitchTextOn(CharSequence onText) { 132be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell mSwitchOn = onText; 133be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell notifyChanged(); 134be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell } 135be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell 136be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell /** 137be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * Set the text displayed on the switch widget in the off state. 138be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * This should be a very short string; one word if possible. 139be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * 140be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * @param offText Text to display in the off state 141be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell */ 142be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell public void setSwitchTextOff(CharSequence offText) { 143be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell mSwitchOff = offText; 144be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell notifyChanged(); 145be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell } 146be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell 147be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell /** 148be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * Set the text displayed on the switch widget in the on state. 149be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * This should be a very short string; one word if possible. 150be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * 151be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * @param resId The text as a string resource ID 152be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell */ 153be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell public void setSwitchTextOn(int resId) { 154be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell setSwitchTextOn(getContext().getString(resId)); 155be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell } 156be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell 157be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell /** 158be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * Set the text displayed on the switch widget in the off state. 159be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * This should be a very short string; one word if possible. 160be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * 161be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * @param resId The text as a string resource ID 162be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell */ 163be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell public void setSwitchTextOff(int resId) { 164be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell setSwitchTextOff(getContext().getString(resId)); 165be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell } 166be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell 167be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell /** 168be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * @return The text that will be displayed on the switch widget in the on state 169be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell */ 170be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell public CharSequence getSwitchTextOn() { 171be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell return mSwitchOn; 172be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell } 173be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell 174be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell /** 175be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * @return The text that will be displayed on the switch widget in the off state 176be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell */ 177be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell public CharSequence getSwitchTextOff() { 178be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell return mSwitchOff; 179be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell } 180be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell} 181