ToggleButton.java revision 54b6cfa9a9e5b861a9930af873580d6dc20f773c
1/*
2 * Copyright (C) 2007 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.widget;
18
19
20import android.content.Context;
21import android.content.res.TypedArray;
22import android.graphics.drawable.Drawable;
23import android.graphics.drawable.LayerDrawable;
24import android.util.AttributeSet;
25
26/**
27 * Displays checked/unchecked states as a button
28 * with a "light" indicator and by default accompanied with the text "ON" or "OFF".
29 *
30 * @attr ref android.R.styleable#ToggleButton_textOn
31 * @attr ref android.R.styleable#ToggleButton_textOff
32 * @attr ref android.R.styleable#ToggleButton_disabledAlpha
33 */
34public class ToggleButton extends CompoundButton {
35    private CharSequence mTextOn;
36    private CharSequence mTextOff;
37
38    private Drawable mIndicatorDrawable;
39
40    private static final int NO_ALPHA = 0xFF;
41    private float mDisabledAlpha;
42
43    public ToggleButton(Context context, AttributeSet attrs, int defStyle) {
44        super(context, attrs, defStyle);
45
46        TypedArray a =
47            context.obtainStyledAttributes(
48                    attrs, com.android.internal.R.styleable.ToggleButton, defStyle, 0);
49        mTextOn = a.getText(com.android.internal.R.styleable.ToggleButton_textOn);
50        mTextOff = a.getText(com.android.internal.R.styleable.ToggleButton_textOff);
51        mDisabledAlpha = a.getFloat(com.android.internal.R.styleable.ToggleButton_disabledAlpha, 0.5f);
52        syncTextState();
53        a.recycle();
54    }
55
56    public ToggleButton(Context context, AttributeSet attrs) {
57        this(context, attrs, com.android.internal.R.attr.buttonStyleToggle);
58    }
59
60    public ToggleButton(Context context) {
61        this(context, null);
62    }
63
64    @Override
65    public void setChecked(boolean checked) {
66        super.setChecked(checked);
67
68        syncTextState();
69    }
70
71    private void syncTextState() {
72        boolean checked = isChecked();
73        if (checked && mTextOn != null) {
74            setText(mTextOn);
75        } else if (!checked && mTextOff != null) {
76            setText(mTextOff);
77        }
78    }
79
80    /**
81     * Returns the text for when the button is in the checked state.
82     *
83     * @return The text.
84     */
85    public CharSequence getTextOn() {
86        return mTextOn;
87    }
88
89    /**
90     * Sets the text for when the button is in the checked state.
91     *
92     * @param textOn The text.
93     */
94    public void setTextOn(CharSequence textOn) {
95        mTextOn = textOn;
96    }
97
98    /**
99     * Returns the text for when the button is not in the checked state.
100     *
101     * @return The text.
102     */
103    public CharSequence getTextOff() {
104        return mTextOff;
105    }
106
107    /**
108     * Sets the text for when the button is not in the checked state.
109     *
110     * @param textOff The text.
111     */
112    public void setTextOff(CharSequence textOff) {
113        mTextOff = textOff;
114    }
115
116    @Override
117    protected void onFinishInflate() {
118        super.onFinishInflate();
119
120        updateReferenceToIndicatorDrawable(getBackground());
121    }
122
123    @Override
124    public void setBackgroundDrawable(Drawable d) {
125        super.setBackgroundDrawable(d);
126
127        updateReferenceToIndicatorDrawable(d);
128    }
129
130    private void updateReferenceToIndicatorDrawable(Drawable backgroundDrawable) {
131        if (backgroundDrawable instanceof LayerDrawable) {
132            LayerDrawable layerDrawable = (LayerDrawable) backgroundDrawable;
133            mIndicatorDrawable =
134                    layerDrawable.findDrawableByLayerId(com.android.internal.R.id.toggle);
135        }
136    }
137
138    @Override
139    protected void drawableStateChanged() {
140        super.drawableStateChanged();
141
142        if (mIndicatorDrawable != null) {
143            mIndicatorDrawable.setAlpha(isEnabled() ? NO_ALPHA : (int) (NO_ALPHA * mDisabledAlpha));
144        }
145    }
146
147}
148