public class

SwitchPreference

extends TwoStatePreference

 java.lang.Object

androidx.preference.Preference

androidx.preference.TwoStatePreference

↳androidx.preference.SwitchPreference

Gradle dependencies

compile group: 'androidx.preference', name: 'preference', version: '1.2.0'

  • groupId: androidx.preference
  • artifactId: preference
  • version: 1.2.0

Artifact androidx.preference:preference:1.2.0 it located at Google repository (https://maven.google.com/)

Androidx artifact mapping:

androidx.preference:preference com.android.support:preference-v7

Androidx class mapping:

androidx.preference.SwitchPreference android.support.v14.preference.SwitchPreference

Overview

A Preference that provides a two-state toggleable option.

This preference will save a boolean value to android.content.SharedPreferences.

Summary

Fields
from TwoStatePreferencemChecked
from PreferenceDEFAULT_ORDER
Constructors
publicSwitchPreference(Context context)

Construct a new SwitchPreference with default style options.

publicSwitchPreference(Context context, AttributeSet attrs)

Construct a new SwitchPreference with the given style options.

publicSwitchPreference(Context context, AttributeSet attrs, int defStyleAttr)

Construct a new SwitchPreference with the given style options.

publicSwitchPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes)

Construct a new SwitchPreference with the given style options.

Methods
public java.lang.CharSequencegetSwitchTextOff()

public java.lang.CharSequencegetSwitchTextOn()

public voidonBindViewHolder(PreferenceViewHolder holder)

Binds the created View to the data for this preference.

protected voidperformClick(View view)

public voidsetSwitchTextOff(java.lang.CharSequence offText)

Set the text displayed on the switch widget in the off state.

public voidsetSwitchTextOff(int resId)

Set the text displayed on the switch widget in the off state.

public voidsetSwitchTextOn(java.lang.CharSequence onText)

Set the text displayed on the switch widget in the on state.

public voidsetSwitchTextOn(int resId)

Set the text displayed on the switch widget in the on state.

from TwoStatePreferencegetDisableDependentsState, getSummaryOff, getSummaryOn, isChecked, onClick, onGetDefaultValue, onRestoreInstanceState, onSaveInstanceState, onSetInitialValue, setChecked, setDisableDependentsState, setSummaryOff, setSummaryOff, setSummaryOn, setSummaryOn, shouldDisableDependents, syncSummaryView, syncSummaryView
from PreferencecallChangeListener, compareTo, findPreferenceInHierarchy, getContext, getDependency, getExtras, getFragment, getIcon, getIntent, getKey, getLayoutResource, getOnPreferenceChangeListener, getOnPreferenceClickListener, getOrder, getParent, getPersistedBoolean, getPersistedFloat, getPersistedInt, getPersistedLong, getPersistedString, getPersistedStringSet, getPreferenceDataStore, getPreferenceManager, getSharedPreferences, getShouldDisableView, getSummary, getSummaryProvider, getTitle, getWidgetLayoutResource, hasKey, isCopyingEnabled, isEnabled, isIconSpaceReserved, isPersistent, isSelectable, isShown, isSingleLineTitle, isVisible, notifyChanged, notifyDependencyChange, notifyHierarchyChanged, onAttached, onAttachedToHierarchy, onAttachedToHierarchy, onDependencyChanged, onDetached, onInitializeAccessibilityNodeInfo, onParentChanged, onPrepareForRemoval, onSetInitialValue, peekExtras, performClick, persistBoolean, persistFloat, persistInt, persistLong, persistString, persistStringSet, restoreHierarchyState, saveHierarchyState, setCopyingEnabled, setDefaultValue, setDependency, setEnabled, setFragment, setIcon, setIconSpaceReserved, setIntent, setKey, setLayoutResource, setOnPreferenceChangeListener, setOnPreferenceClickListener, setOrder, setPersistent, setPreferenceDataStore, setSelectable, setShouldDisableView, setSingleLineTitle, setSummary, setSummary, setSummaryProvider, setTitle, setTitle, setViewId, setVisible, setWidgetLayoutResource, shouldPersist, toString
from java.lang.Objectclone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait

Constructors

public SwitchPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes)

Construct a new SwitchPreference with the given style options.

Parameters:

context: The that will style this preference
attrs: Style attributes that differ from the default
defStyleAttr: An attribute in the current theme that contains a reference to a style resource that supplies default values for the view. Can be 0 to not look for defaults.
defStyleRes: A resource identifier of a style resource that supplies default values for the view, used only if defStyleAttr is 0 or can not be found in the theme. Can be 0 to not look for defaults.

public SwitchPreference(Context context, AttributeSet attrs, int defStyleAttr)

Construct a new SwitchPreference with the given style options.

Parameters:

context: The that will style this preference
attrs: Style attributes that differ from the default
defStyleAttr: An attribute in the current theme that contains a reference to a style resource that supplies default values for the view. Can be 0 to not look for defaults.

public SwitchPreference(Context context, AttributeSet attrs)

Construct a new SwitchPreference with the given style options.

Parameters:

context: The that will style this preference
attrs: Style attributes that differ from the default

public SwitchPreference(Context context)

Construct a new SwitchPreference with default style options.

Parameters:

context: The that will style this preference

Methods

public void onBindViewHolder(PreferenceViewHolder holder)

Binds the created View to the data for this preference.

This is a good place to grab references to custom Views in the layout and set properties on them.

Make sure to call through to the superclass's implementation.

Parameters:

holder: The ViewHolder that provides references to the views to fill in. These views will be recycled, so you should not hold a reference to them after this method returns.

public void setSwitchTextOn(java.lang.CharSequence onText)

Set the text displayed on the switch widget in the on state. This should be a very short string, one word if possible.

Parameters:

onText: Text to display in the on state

public void setSwitchTextOff(java.lang.CharSequence offText)

Set the text displayed on the switch widget in the off state. This should be a very short string, one word if possible.

Parameters:

offText: Text to display in the off state

public java.lang.CharSequence getSwitchTextOn()

Returns:

The text that will be displayed on the switch widget in the on state

public void setSwitchTextOn(int resId)

Set the text displayed on the switch widget in the on state. This should be a very short string, one word if possible.

Parameters:

resId: The text as a string resource ID

public java.lang.CharSequence getSwitchTextOff()

Returns:

The text that will be displayed on the switch widget in the off state

public void setSwitchTextOff(int resId)

Set the text displayed on the switch widget in the off state. This should be a very short string, one word if possible.

Parameters:

resId: The text as a string resource ID

protected void performClick(View view)

Parameters:

view:

Source

/*
 * Copyright (C) 2015 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package androidx.preference;

import static androidx.annotation.RestrictTo.Scope.LIBRARY;

import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.view.View;
import android.view.accessibility.AccessibilityManager;
import android.widget.Checkable;
import android.widget.CompoundButton;
import android.widget.Switch;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RestrictTo;
import androidx.core.content.res.TypedArrayUtils;

/**
 * A {@link Preference} that provides a two-state toggleable option.
 *
 * <p>This preference will save a boolean value to {@link android.content.SharedPreferences}.
 *
 * @attr name android:summaryOff
 * @attr name android:summaryOn
 * @attr name android:switchTextOff
 * @attr name android:switchTextOn
 * @attr name android:disableDependentsState
 */
public class SwitchPreference extends TwoStatePreference {
    private final Listener mListener = new Listener();

    // Switch text for on and off states
    private CharSequence mSwitchOn;
    private CharSequence mSwitchOff;

    /**
     * Construct a new SwitchPreference with the given style options.
     *
     * @param context      The {@link Context} that will style this preference
     * @param attrs        Style attributes that differ from the default
     * @param defStyleAttr An attribute in the current theme that contains a reference to a style
     *                     resource that supplies default values for the view. Can be 0 to not
     *                     look for defaults.
     * @param defStyleRes  A resource identifier of a style resource that supplies default values
     *                     for the view, used only if defStyleAttr is 0 or can not be found in the
     *                     theme. Can be 0 to not look for defaults.
     */
    public SwitchPreference(@NonNull Context context, @Nullable AttributeSet attrs,
            int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);

        TypedArray a = context.obtainStyledAttributes(attrs,
                R.styleable.SwitchPreference, defStyleAttr, defStyleRes);

        setSummaryOn(TypedArrayUtils.getString(a, R.styleable.SwitchPreference_summaryOn,
                R.styleable.SwitchPreference_android_summaryOn));

        setSummaryOff(TypedArrayUtils.getString(a, R.styleable.SwitchPreference_summaryOff,
                R.styleable.SwitchPreference_android_summaryOff));

        setSwitchTextOn(TypedArrayUtils.getString(a,
                R.styleable.SwitchPreference_switchTextOn,
                R.styleable.SwitchPreference_android_switchTextOn));

        setSwitchTextOff(TypedArrayUtils.getString(a,
                R.styleable.SwitchPreference_switchTextOff,
                R.styleable.SwitchPreference_android_switchTextOff));

        setDisableDependentsState(TypedArrayUtils.getBoolean(a,
                R.styleable.SwitchPreference_disableDependentsState,
                R.styleable.SwitchPreference_android_disableDependentsState, false));

        a.recycle();
    }

    /**
     * Construct a new SwitchPreference with the given style options.
     *
     * @param context      The {@link Context} that will style this preference
     * @param attrs        Style attributes that differ from the default
     * @param defStyleAttr An attribute in the current theme that contains a reference to a style
     *                     resource that supplies default values for the view. Can be 0 to not
     *                     look for defaults.
     */
    public SwitchPreference(@NonNull Context context, @Nullable AttributeSet attrs,
            int defStyleAttr) {
        this(context, attrs, defStyleAttr, 0);
    }

    /**
     * Construct a new SwitchPreference with the given style options.
     *
     * @param context The {@link Context} that will style this preference
     * @param attrs   Style attributes that differ from the default
     */
    public SwitchPreference(@NonNull Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, TypedArrayUtils.getAttr(context,
                androidx.preference.R.attr.switchPreferenceStyle,
                android.R.attr.switchPreferenceStyle));
    }

    /**
     * Construct a new SwitchPreference with default style options.
     *
     * @param context The {@link Context} that will style this preference
     */
    public SwitchPreference(@NonNull Context context) {
        this(context, null);
    }

    @Override
    public void onBindViewHolder(@NonNull PreferenceViewHolder holder) {
        super.onBindViewHolder(holder);
        View switchView = holder.findViewById(AndroidResources.ANDROID_R_SWITCH_WIDGET);
        syncSwitchView(switchView);
        syncSummaryView(holder);
    }

    /**
     * Set the text displayed on the switch widget in the on state.
     * This should be a very short string, one word if possible.
     *
     * @param onText Text to display in the on state
     */
    public void setSwitchTextOn(@Nullable CharSequence onText) {
        mSwitchOn = onText;
        notifyChanged();
    }

    /**
     * Set the text displayed on the switch widget in the off state.
     * This should be a very short string, one word if possible.
     *
     * @param offText Text to display in the off state
     */
    public void setSwitchTextOff(@Nullable CharSequence offText) {
        mSwitchOff = offText;
        notifyChanged();
    }

    /**
     * @return The text that will be displayed on the switch widget in the on state
     */
    @Nullable
    public CharSequence getSwitchTextOn() {
        return mSwitchOn;
    }

    /**
     * Set the text displayed on the switch widget in the on state.
     * This should be a very short string, one word if possible.
     *
     * @param resId The text as a string resource ID
     */
    public void setSwitchTextOn(int resId) {
        setSwitchTextOn(getContext().getString(resId));
    }

    /**
     * @return The text that will be displayed on the switch widget in the off state
     */
    @Nullable
    public CharSequence getSwitchTextOff() {
        return mSwitchOff;
    }

    /**
     * Set the text displayed on the switch widget in the off state.
     * This should be a very short string, one word if possible.
     *
     * @param resId The text as a string resource ID
     */
    public void setSwitchTextOff(int resId) {
        setSwitchTextOff(getContext().getString(resId));
    }

    /**
     * @hide
     * @param view
     */
    @RestrictTo(LIBRARY)
    @Override
    protected void performClick(@NonNull View view) {
        super.performClick(view);
        syncViewIfAccessibilityEnabled(view);
    }

    private void syncViewIfAccessibilityEnabled(View view) {
        AccessibilityManager accessibilityManager = (AccessibilityManager)
                getContext().getSystemService(Context.ACCESSIBILITY_SERVICE);
        if (!accessibilityManager.isEnabled()) {
            return;
        }

        View switchView = view.findViewById(AndroidResources.ANDROID_R_SWITCH_WIDGET);
        syncSwitchView(switchView);

        View summaryView = view.findViewById(android.R.id.summary);
        syncSummaryView(summaryView);
    }

    private void syncSwitchView(View view) {
        if (view instanceof Switch) {
            final Switch switchView = (Switch) view;
            switchView.setOnCheckedChangeListener(null);
        }
        if (view instanceof Checkable) {
            ((Checkable) view).setChecked(mChecked);
        }
        if (view instanceof Switch) {
            final Switch switchView = (Switch) view;
            switchView.setTextOn(mSwitchOn);
            switchView.setTextOff(mSwitchOff);
            switchView.setOnCheckedChangeListener(mListener);
        }
    }

    private class Listener implements CompoundButton.OnCheckedChangeListener {
        Listener() {}

        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if (!callChangeListener(isChecked)) {
                // Listener didn't like it, change it back.
                // CompoundButton will make sure we don't recurse.
                buttonView.setChecked(!isChecked);
                return;
            }

            SwitchPreference.this.setChecked(isChecked);
        }
    }
}