Android 将PreferenceCategory动态添加到PreferenceScreen时出错

Android 将PreferenceCategory动态添加到PreferenceScreen时出错,android,android-preferences,Android,Android Preferences,我目前正计划在我的应用程序中实施动态通知设置。如果当前设备正在运行Android Oreo,则显示通知频道设置。如果不是Android Oreo,则显示另一个设置(PreferenceCategory) 以下是我的代码片段,用于在设备版本不是Oreo时显示: for(MyNotificationChannel notificationChannel:notificationChannel){ System.out.println(“在索引处创建的通知通道”+notificationChannel

我目前正计划在我的应用程序中实施动态通知设置。如果当前设备正在运行Android Oreo,则显示通知频道设置。如果不是Android Oreo,则显示另一个设置(
PreferenceCategory

以下是我的代码片段,用于在设备版本不是Oreo时显示:

for(MyNotificationChannel notificationChannel:notificationChannel){
System.out.println(“在索引处创建的通知通道”+notificationChannel.getIndex());
PreferenceCategory PreferenceCategory=新的PreferenceCategory(preferenceScreen.getContext());
preferenceCategory.setTitle(notificationChannel.getNotificationTitle());
preferenceCategory.setSummary(notificationChannel.getNotificationDesc());
SwitchPreference enableNotificationPreference=新的SwitchPreference(preferenceScreen.getContext());
enableNotificationPreference.setDefaultValue(true);
setTitle(“启用通知通道”);
enableNotificationPreference.setOnPreferenceChangeListener(新的Preference.OnPreferenceChangeListener()){
@凌驾
公共布尔onPreferenceChange(首选项首选项,对象newValue){
System.out.println(“首选项更改:+newValue”);
返回true;
}
});
preferenceCategory.addPreference(enableNotificationPreference);
SwitchPreference EnableVibrablePreference=新的SwitchPreference(preferenceScreen.getContext());
EnableVibrationPreference.setTitle(“振动”);
EnableVibrationPreference.setSummary(“有可用通知时是否振动”);
EnableVibrationPreference.setDefaultValue(true);
启用VibrablePreference.setIcon(R.drawable.ic_Vibrable_white_24dp);
EnableVibrationPreference.setOnPreferenceChangeListener(新的Preference.OnPreferenceChangeListener()){
@凌驾
公共布尔onPreferenceChange(首选项首选项,对象newValue){
System.out.println(“首选项更改:+newValue”);
返回true;
}
});
RingtonePreference notificationRingtonePreference=新的RingtonePreference(preferenceScreen.getContext());
notificationRingtonePreference.setIcon(R.drawable.ic\U music\U white\U 24dp);
notificationRingtonePreference.setTitle(“设置铃声”);
bindPreferenceSummaryToValue(NotificationRingToReference);
preferenceCategory.addPreference(notificationRingtonePreference);
preferenceScreen.addPreference(首选项类别);
}
(顺便说一句,
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)

编辑:这是我的首选项文件:



编辑#2:当我恢复到最初的实现(针对Android Oreo)时,它可以工作:

PreferenceCategory notificationPrefCategory=新建PreferenceCategory(preferenceScreen.getContext());
notificationPrefCategory.setTitle(“通知通道”);
preferenceScreen.addPreference(notificationPrefCategory);
Preference allNotificationsPreference=新的首选项(preferenceScreen.getContext());
AllNotificationsReference.setTitle(R.string.notification\u channel\u all\u channels\u title);
allNotificationsPreference.setOnPreferenceClickListener(新建首选项.OnPreferenceClickListener()){
@凌驾
公共布尔值打开首选项单击(首选项){
if(Build.VERSION.SDK\u INT>=Build.VERSION\u code.O){
意向意向=新意向(设置、动作、应用、通知、设置);
intent.putExtra(Settings.EXTRA_APP_包,getActivity().getPackageName());
星触觉(意向);
}
返回false;
}
});
notificationPrefCategory.addPreference(所有NotificationsPreference);
对于(MyNotificationChannel notificationChannel:notificationChannel){
Preference notificationPreference=新的首选项(preferenceScreen.getContext());
notificationPreference.setTitle(notificationChannel.getNotificationTitle());
notificationPreference.setSummary(notificationChannel.getNotificationDesc());
notificationPreference.setKey(NotificationChannelId[notificationChannel.getIndex()]);
notificationPreference.setOnPreferenceClickListener(新的首选项.OnPreferenceClickListener(){
@凌驾
公共布尔值打开首选项单击(首选项){
if(Build.VERSION.SDK\u INT>=Build.VERSION\u code.O){
意向意向=新意向(设置、动作、频道、通知、设置);
intent.putExtra(Settings.EXTRA_APP_包,getActivity().getPackageName());
intent.putExtra(Settings.EXTRA_CHANNEL_ID,preference.getKey());
星触觉(意向);
}
返回false;
}
});
notificationPrefCategory.addPreference(notificationPreference);
}

我通过在定义所有其他首选项之前,向上移动将首选项类别添加到首选项屏幕的行,解决了该问题:

//这一行
preferenceScreen.addPreference(首选项类别);

(注意,在我定义了
首选项类别之后,我将其移动到了)

我通过在定义所有其他首选项之前向上移动将首选项类别添加到首选项屏幕的行,解决了这个问题:

//这一行
preferenceScreen.addPreference(首选项类别);

(另外,在定义了
首选项类别之后,我将其移动到了)

设置活动中有什么内容。java:345
?此行:
首选项类别。添加首选项(enableNotificationPreference)设置一个断点并检查为什么
enableNotificationPreference
变为空。@Belladona这里有一个