setSummary的首选项(NullPointerException)

时间:2013-11-27 17:35:42

标签: android nullpointerexception android-preferences

我想在更改时设置首选项的摘要。我刚从官方的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()

完全崩溃

2 个答案:

答案 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