在首选项更改侦听器上 - 单击 运行 两次后
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);
}
我不知道如何处理这个奇怪的问题...
我该怎么办?
匿名调用OnSharedPreferenceChangeListener
class使其成为垃圾回收的目标。
一旦您离开当前范围并可能导致 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
我的应用首选项 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);
}
我不知道如何处理这个奇怪的问题... 我该怎么办?
匿名调用OnSharedPreferenceChangeListener
class使其成为垃圾回收的目标。
一旦您离开当前范围并可能导致 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