0

I have a preference screen having multiple SwitchpreferenceCompat. I need to give a user choice of theme change,vibration,etc in settingActivity. Can any one help me in how to set vibrate or theme change by clicking switch in settingactivity. I used this inside my settingActivity fragment but when i click setting activity the app stops

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>

User clicks the vibration on the app must vibrate when the button is clicked in the activity. How can i do this?

enter image description here

Progman
  • 16,827
  • 6
  • 33
  • 48
Learner
  • 41
  • 6

1 Answers1

0

Use Androidx library

implementation 'androidx.preference:preference:1.1.1'

Then create xml folder and add your SwitchPreferenceCompat like below:

<?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>

Then create SwitchPreferenceCompatActivity like below:

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);
            }
        }
    }
}

}

Note: add <uses-permission android:name="android.permission.VIBRATE" /> permission on manifest file.

Fahad Nasrullah
  • 329
  • 1
  • 5