Android 如何在更通用的PreferenceFragment中侦听首选项更改?

Android 如何在更通用的PreferenceFragment中侦听首选项更改?,android,onchange,android-preferences,Android,Onchange,Android Preferences,我使用PreferenceFragment和OnChangeListener实现了一个首选项屏幕,以显示当前值作为摘要。下面的代码工作得很好,但通过这种方式,我需要为每个首选项提供一个OnChangeListener 设置活动.java import android.content.SharedPreferences; import android.content.SharedPreferences.OnSharedPreferenceChangeListener; import android

我使用PreferenceFragment和OnChangeListener实现了一个首选项屏幕,以显示当前值作为摘要。下面的代码工作得很好,但通过这种方式,我需要为每个首选项提供一个OnChangeListener

设置活动.java

import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.os.Bundle;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.preference.PreferenceFragment;

public class UserSettingActivity extends PreferenceActivity {

    public static final String PREF_EXCERCISES = "pref_number_of_exercises";
    public static final String PREF_TASKS = "pref_number_of_tasks";

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

        // Display the fragment as the main content.
        getFragmentManager().beginTransaction().replace(android.R.id.content, new MyPreferenceFragment()).commit(); 
    }


    public static class MyPreferenceFragment extends PreferenceFragment {
        @Override
        public void onCreate(final Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);

            //add the settings.xml layout
            addPreferencesFromResource(R.xml.settings);

            // update the preferences if they change
            setUpdatePreferences();
        }

        private void setUpdatePreferences() {
            //get the specified preferences using the key declared in preferences.xml
            ListPreference dataPrefConType = (ListPreference) findPreference(PREF_EXCERCISES);

            //get the description from the selected item
            dataPrefConType.setSummary( dataPrefConType.getEntry() );

            //when the user choose other item the description changes too with the selected item
            dataPrefConType.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
                @Override
                public boolean onPreferenceChange(Preference preference, Object o) {
                    preference.setSummary(o.toString());
                    return true;
                }
            });
        }
    }
}
import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.os.Bundle;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.preference.PreferenceFragment;
import android.util.Log;

public class UserSettingActivity extends PreferenceActivity {

    public static final String PREF_EXCERCISES = "pref_number_of_exercises";
    public static final String PREF_TASKS = "pref_number_of_tasks";

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

        // Display the fragment as the main content.
        getFragmentManager().beginTransaction().replace(android.R.id.content, new MyPreferenceFragment()).commit(); 
    }


    public static class MyPreferenceFragment extends PreferenceFragment
      implements OnSharedPreferenceChangeListener {
        @Override
        public void onCreate(final Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);

            //add the settings.xml layout
            addPreferencesFromResource(R.xml.settings);

            // update the preferences if they change
            //setUpdatePreferences();
        }

        @Override
        public void onResume() {
            super.onResume();
            getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
        }

        @Override
        public void onPause() {
            getPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
            super.onPause();
        }

        @Override
        public void onSharedPreferenceChanged(
                SharedPreferences sharedPreferences, String key) {

            Log.i("settings", "preference changed: " + key);

        }
    }
}
preferences.xml

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

    <EditTextPreference
        android:defaultValue="15"
        android:enabled="true"
        android:key="pref_number_of_exercises"
        android:numeric="integer"
        android:title="Number of exercises" />

    <EditTextPreference
        android:defaultValue="15"
        android:enabled="true"
        android:key="pref_number_of_tasks"
        android:numeric="integer"
        android:title="Number of tasks" />

</PreferenceScreen>

它在哪里坠毁?这是什么样的碰撞?你能检查一下Logcat并提供更多的信息吗?我从头开始实现了这个东西,现在它可以工作了。看来我在什么地方做错了。无论如何谢谢你!