问题描述
我有一个带有多个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>
用户单击时,在活动中单击按钮时,应用程序上的振动必须振动。我该怎么办?
解决方法
使用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" />
权限。