我想在更改时设置首选项的摘要。我刚从官方的android教程中复制了代码,然后将其更改为符合我的需求。 - 实际上我没有改变任何必要的东西。
这一切都发生在onSharedPreferenceChanged
听众
不幸的是,我得到了NullPointerException
如下所述。
} else if (key.equals("pulse")) {
//NullPointerException for .setSummary()
new SettingsFragment().findPreference(key).setSummary("Current: "
+ sharedPreferences.getInt(key, 2) * 2
+ " seconds");
}
我已将此设置为首选项:
android:key="pulse"
任何解决方案?
11-27 18:07:46.873 2009-2009/net.mejmun.hellophone E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.NullPointerException
at net.mejmun.hellophone.Settings.onSharedPreferenceChanged(Settings.java:56)
编辑:现在将其更改为
} else if (key.equals("pulse")) {
Log.i(getApplication().getPackageName(), "start");
Preference Pref = new SettingsFragment().findPreference(key);
Log.i(getApplication().getPackageName(), "found");
Pref.setSummary(getString(R.string.toast_pulse_curr)
+ sharedPreferences.getInt(key, 2) * 2
+ getString(R.string.toast_pulse_sec));
Log.i(getApplication().getPackageName(), "done!");
}
它与setSummary()
答案 0 :(得分:0)
只要对象不存在,就会抛出NullPointerException
。
所以偏好显然不存在,你确定已经设置好了吗?
您可以添加一项检查以查看findPreference(key)
是否等于零,并且仅当它不为零时运行代码。
或者只是事先声明偏好:
} else if (key.equals("pulse")) {
sharedPreferences.getInt(key, 2);
/** rest of the code here **/
}
修改强>:
如果您尝试在新片段中导入首选项,该怎么办?
但是你也应该在新片段中导入首选项。
Preference Pref = new SettingsFragment().findPreference(key);
pref.addPreferencesFromResource(R.xml.preferences); // <-- NEW
Log.i(getApplication().getPackageName(), "found");
Pref.setSummary(getString(R.string.toast_pulse_curr)
+ sharedPreferences.getInt(key, 2) * 2
+ getString(R.string.toast_pulse_sec));
答案 1 :(得分:0)
你的应用程序正在崩溃,因为你这样称呼它......
new SettingsFragment().findPreference( key )
您正在实例化一个新的SettingsFragment,但您还没有调用onCreate,并且Android系统没有调用onCreate,因为您是自己创建的而不是通过活动创建的。在这一点上它是一个空片段。 findPreference方法将返回null,因为片段为空并且对setSummary的调用将失败。
您的SettingsFragment
应该是onSharedPreferenceChanged
听众。然后,您就可以自己致电findPreference
。