Edr*_*ric 1 android android-preferences
我目前计划在我的应用中实施动态通知设置。如果当前设备运行的是 Android Oreo,则显示通知渠道设置。如果不是 Android Oreo,则显示另一个设置 ( PreferenceCategory)
这是我的代码片段,用于在设备版本不是 Oreo 时显示:
for (MyNotificationChannel notificationChannel : notificationChannels) {
System.out.println("Notification channel created at index " + notificationChannel.getIndex());
PreferenceCategory preferenceCategory = new PreferenceCategory(preferenceScreen.getContext());
preferenceCategory.setTitle(notificationChannel.getNotificationTitle());
preferenceCategory.setSummary(notificationChannel.getNotificationDesc());
SwitchPreference enableNotificationPreference = new SwitchPreference(preferenceScreen.getContext());
enableNotificationPreference.setDefaultValue(true);
enableNotificationPreference.setTitle("Enable notification channel");
enableNotificationPreference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
System.out.println("Preference change: " + newValue);
return true;
}
});
preferenceCategory.addPreference(enableNotificationPreference);
SwitchPreference enableVibratePreference = new SwitchPreference(preferenceScreen.getContext());
enableVibratePreference.setTitle("Vibrate");
enableVibratePreference.setSummary("Whether to vibrate when there are notifications available");
enableVibratePreference.setDefaultValue(true);
enableVibratePreference.setIcon(R.drawable.ic_vibrate_white_24dp);
enableVibratePreference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
System.out.println("Preference change: " + newValue);
return true;
}
});
RingtonePreference notificationRingtonePreference = new RingtonePreference(preferenceScreen.getContext());
notificationRingtonePreference.setIcon(R.drawable.ic_music_white_24dp);
notificationRingtonePreference.setTitle("Set ringtone");
bindPreferenceSummaryToValue(notificationRingtonePreference);
preferenceCategory.addPreference(notificationRingtonePreference);
preferenceScreen.addPreference(preferenceCategory);
}
Run Code Online (Sandbox Code Playgroud)
(顺便说一句,MyNotificationChannel只是一个类,作为我的通知设置的接口,以便更轻松地从中获取内容strings.xml)
但是,当我尝试导航到通知片段时出现此错误:
java.lang.NullPointerException: Attempt to invoke virtual method 'long android.preference.PreferenceManager.getNextId()' on a null object reference
at android.preference.Preference.onAttachedToHierarchy(Preference.java:1326)
at android.preference.PreferenceGroup.addPreference(PreferenceGroup.java:163)
at com.edricchan.studybuddy.SettingsActivity$NotificationPreferenceFragment.onCreate(SettingsActivity.java:345)
at android.app.Fragment.performCreate(Fragment.java:2489)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1237)
at android.app.FragmentManagerImpl.addAddedFragments(FragmentManager.java:2407)
at android.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2186)
at android.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2142)
at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2043)
at android.app.FragmentManagerImpl$1.run(FragmentManager.java:719)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:440)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
Run Code Online (Sandbox Code Playgroud)
编辑:这是我的首选项文件:
java.lang.NullPointerException: Attempt to invoke virtual method 'long android.preference.PreferenceManager.getNextId()' on a null object reference
at android.preference.Preference.onAttachedToHierarchy(Preference.java:1326)
at android.preference.PreferenceGroup.addPreference(PreferenceGroup.java:163)
at com.edricchan.studybuddy.SettingsActivity$NotificationPreferenceFragment.onCreate(SettingsActivity.java:345)
at android.app.Fragment.performCreate(Fragment.java:2489)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1237)
at android.app.FragmentManagerImpl.addAddedFragments(FragmentManager.java:2407)
at android.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2186)
at android.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2142)
at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2043)
at android.app.FragmentManagerImpl$1.run(FragmentManager.java:719)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:440)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
Run Code Online (Sandbox Code Playgroud)
编辑 #2:当我恢复到我的原始实现(对于 Android Oreo)时,它可以工作:
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<!-- This preference screen will be filled in via code -->
</PreferenceScreen>
Run Code Online (Sandbox Code Playgroud)
我通过将首选项类别添加到首选项屏幕的行向上移动到定义所有其他首选项之前解决了该问题:
// This line
preferenceScreen.addPreference(preferenceCategory);
Run Code Online (Sandbox Code Playgroud)
(PS我在定义之后将它移到了PreferenceCategory)