通过使用switchpreferenceCompat设置SettingActivity

问题描述

我有一个带有多个SwitchpreferenceCompat的首选项屏幕。我需要在settingActivity中为用户提供主题更改,振动等选择。单击设置活动中的开关,谁能帮助我设置振动或主题更改。我在我的settingActivity片段中使用了它,但是当我单击设置活动时,应用程序停止了

SwitchPreferenceCompat switchPref = findPreference("key");
switchPref.setChecked(true);

`res / xml / root_preference.xml

 <SwitchPreferenceCompat
        android:id="@+id/vibrate"
        app:key="On"
        app:title="Vibrate"
        android:summaryOff="Off"
        android:summaryOn="On"
        app:icon="@drawable/ic_baseline_vibration_24"
        android:defaultValue="true" />

    <SwitchPreferenceCompat
        app:key="On"
        app:title="Sound"
        app:summaryOff="Off"
        app:summaryOn="On"
        app:icon="@drawable/ic_baseline_volume_up_24"
        android:defaultValue="true"/>

</PreferenceCategory>

用户单击时,在活动中单击按钮时,应用程序上的振动必须振动。我该怎么办?

enter image description here

解决方法

使用Androidx库

implementation 'androidx.preference:preference:1.1.1'

然后创建xml文件夹并添加您的SwitchPreferenceCompat,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<androidx.preference.PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="match_parent"
android:layout_width="match_parent">

<SwitchPreferenceCompat
    android:id="@+id/vibrate"
    android:key="vibrate"
    android:summary="It will vibrate your phone"
    android:title="Vibrate"/>

<SwitchPreferenceCompat
    android:id="@+id/changeTheme"
    android:key="theme"
    android:title="Change Theme"
    android:summary="It will toggle your app theme"/>

</androidx.preference.PreferenceScreen>

然后按如下所示创建SwitchPreferenceCompatActivity

public class SwitchPreferenceCompatActivity extends AppCompatActivity {

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_switch_preference_compat);

    if(savedInstanceState == null) {
        getSupportFragmentManager()
                .beginTransaction()
                .replace(R.id.preferences_container,new MySettingsFragment())
                .commit();
    }


}

public static class MySettingsFragment extends PreferenceFragmentCompat {
    SharedPreferences.OnSharedPreferenceChangeListener listener;

    @Override
    public void onCreatePreferences(Bundle savedInstanceState,String rootKey) {
        setPreferencesFromResource(R.xml.my_switch_preference_compat,rootKey);
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        listener = new SharedPreferences.OnSharedPreferenceChangeListener() {
            @Override
            public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,String key) {
                Log.e("key",key);
                if(key.equals("vibrate") && sharedPreferences.getBoolean("vibrate",false)) {
                    vibratePhone();
                }
            }
        };

    }

    @Override
    public void onResume() {
        super.onResume();
        getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(listener);
    }

    @Override
    public void onPause() {
        super.onPause();
        getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(listener);
    }

    private void vibratePhone() {
        Vibrator vibrator = (Vibrator) getActivity().getSystemService(Context.VIBRATOR_SERVICE);
        if (vibrator != null) {
    // Vibrate for 500 milliseconds
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                vibrator.vibrate(VibrationEffect.createOneShot(500,VibrationEffect.DEFAULT_AMPLITUDE));
            } else {
                //deprecated in API 26
                vibrator.vibrate(500);
            }
        }
    }
}

}

注意:对清单文件添加<uses-permission android:name="android.permission.VIBRATE" />权限。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...