MainActivity.java
res/xml/my_prefer.xml
res/layout/activity_main.xml
MainActivity.java如下:
package com.example.srx.myapplication; import android.preference.Preference; import android.preference.SwitchPreference; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.preference.PreferenceFragment; import android.util.Log; import java.util.prefs.PreferenceChangeEvent; import java.util.prefs.PreferenceChangeListener; public class MainActivity extends AppCompatActivity{ private String TAG = "SrxPre"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } // public static class MyPreferenceFra extends PreferenceFragment{ public static class MyPreferenceFra extends PreferenceFragment implements Preference.OnPreferenceClickListener,Preference.OnPreferenceChangeListener{ private String TAG = "SrxPre"; private SwitchPreference mSwitchPreference; @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.my_prefer); mSwitchPreference = (SwitchPreference) findPreference("pre_key"); mSwitchPreference.setOnPreferenceClickListener(this); mSwitchPreference.setOnPreferenceChangeListener(this); } @Override public boolean onPreferenceClick(Preference preference) { Log.e(TAG,"srx--onpreferenceclick--"); return true; } @Override public boolean onPreferenceChange(Preference preference, Object newValue) { Log.e(TAG,"srx--onPreferenceChange--"); if(mSwitchPreference.equals(preference)){ boolean value = (Boolean)(newValue); Log.e(TAG,"srx-2222-onPreferenceChange--,value="+value); } if(preference.getKey().equals("pre_key")){ //judge according key Log.e(TAG,"srx-3333-onPreferenceChange--"); } return true; } } }
my_prefer.xml
<?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <SwitchPreference android:key="pre_key" android:title="SwitchPreference" android:summary="srx-summary" /> </PreferenceScreen>
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <fragment android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/settingsFragment" android:name="com.example.srx.myapplication.MainActivity$MyPreferenceFra"/> </android.support.constraint.ConstraintLayout>
Log打印
01-01 10:47:39.899 2909 2909 E SrxPre : srx--onPreferenceChange--
01-01 10:47:39.899 2909 2909 E SrxPre : srx-2222-onPreferenceChange--,value=true
01-01 10:47:39.899 2909 2909 E SrxPre : srx-3333-onPreferenceChange--
01-01 10:47:39.899 2909 2909 E SrxPre : srx--onpreferenceclick--
01-01 10:47:39.929 2909 2909 E SrxPre : srx--onPreferenceChange--
01-01 10:47:39.929 2909 2909 E SrxPre : srx-2222-onPreferenceChange--,value=true
01-01 10:47:39.929 2909 2909 E SrxPre : srx-3333-onPreferenceChange--
需要注意几点:
1.如果想监听onpreferenceclick(点击了这个preference),onpreferencechanged(点击开关状态改变),需要让这个switchPreferece.setonxxListener()才行,不然点击时不会打印在onxxclick/onxxchangedlistener中的log.
2.switchpreference在不设置监听前,能点击开和关的,设置了监听后,如果onxxxclick/onxxchanged的回调函数返回false, switchpreference就变的不能开关了。这时候需要把回调函数中的return false->return true,这样就可以了
3. switchpreference的开关状态,可以通过: public boolean onPreferenceChange(Preference preference, Object newValue),这里的newValue来获取。