在首选项更改侦听器上 - 单击 运行 两次后

On Preference change listener - after click run twice

我的应用首选项 activity 中有 EditTextPreference,我添加了这个,以检测 edittext 中的文本何时更改。一切正常,除此之外,代码总是运行两次...我尝试添加 System.out.println("now"); 来证明代码是否运行两次,并且它写入 "now" 两次...

代码如下:

SharedPreferences.OnSharedPreferenceChangeListener myPrefListner;

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

    addPreferencesFromResource(R.xml.admin_activity);

myPrefListner = new SharedPreferences.OnSharedPreferenceChangeListener(){
        public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
            switch(key) {
                case "prefAddUser":
                    EditTextPreference connectionPref = (EditTextPreference) findPreference(key);
                    String jmeno = connectionPref.getText();
                    System.out.println("now");
                    add_user(jmeno); //custom method to add user to MySQL database
                    Toast.makeText(getApplicationContext(), "add user", Toast.LENGTH_SHORT).show();
                    connectionPref.setText("");
                    break;

            }
        }
    };
}
@Override
protected void onResume() {
    super.onResume();
    getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(myPrefListner);
}



@Override
protected void onPause() {
    super.onPause();
    getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(myPrefListner);

}

我不知道如何处理这个奇怪的问题... 我该怎么办?

匿名调用OnSharedPreferenceChangeListenerclass使其成为垃圾回收的目标。
一旦您离开当前范围并可能导致 unregisterOnSharedPreferenceChangeListener() 在空上下文中被调用。


在 class 范围内像这样实现它:

public class SettingsActivity extends PreferenceActivity
                              implements OnSharedPreferenceChangeListener {
    public static final String KEY_PREF_SYNC_CONN = "pref_syncConnectionType";
    ...

    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
        String key) {
        if (key.equals(KEY_PREF_SYNC_CONN)) {
            Preference connectionPref = findPreference(key);
            // Set summary to be the user-description for the selected value
            connectionPref.setSummary(sharedPreferences.getString(key, ""));
        }
    }
}


阅读下一个教程以获得进一步的解释:
1. Good So answer on the subject
2.官方文档here