NPE在NotificaitionCompat.Builder中

时间:2019-02-02 17:24:15

标签: java android notifications

当我想在通知中显示用户输入时,我的应用因NPE崩溃。问题是我不知道如何在NotificationNoter.java中增加视图。在代码之后,您可以看到我已经尝试过的内容。
在这里您可以看到课程:
NotificationHelper.java

public class NotificationHelper extends ContextWrapper {
public static final String channelID = "channelID";
public static final String channelName = "Channel Name";
private NotificationManager mManager;
private EditText titelAlarm;
private View v;

public NotificationHelper(Context base) {
    super(base);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        createChannel();
    }
}

@TargetApi(Build.VERSION_CODES.O)
private void createChannel() {
    NotificationChannel channel = new NotificationChannel(channelID, channelName, NotificationManager.IMPORTANCE_HIGH);

    getManager().createNotificationChannel(channel);
}

public NotificationManager getManager() {
    if (mManager == null) {
        mManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    }

    return mManager;
}

public NotificationCompat.Builder getChannelNotification() {
    titelAlarm = v.findViewById(R.id.eingUserAlarm);
    String nameAlarm = titelAlarm.getText().toString();
    return new NotificationCompat.Builder(getApplicationContext(), channelID)
            .setContentTitle("Erinnerung")
            .setContentText(nameAlarm)
            .setSmallIcon(R.drawable.ic_one);
     }
}

这是我的按钮,由OnClick设置警报:
fragment.xml中的按钮:

    <Button
    android:id="@+id/button_timepicker"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true"
    android:text="Zeit stellen" />

这是我的 Fragment.java:

    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    this.savedInstanceState = savedInstanceState;
    final View fraAla = inflater.inflate(R.layout.fragment_alarm, container, false);

    edText = fraAla.findViewById(R.id.eingUserAlarm);
    mTextView = fraAla.findViewById(R.id.textView);

    Button buttonTimePicker = fraAla.findViewById(R.id.button_timepicker);
    buttonTimePicker.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            DialogFragment timePicker = new AlarmTimePicker();
            timePicker.show(getChildFragmentManager(), "time picker");
        }
    });

    Button buttonCancelAlarm = fraAla.findViewById(R.id.button_cancel);
    buttonCancelAlarm.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            cancelAlarm();
        }
    });
    return fraAla;
}

@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
    Calendar c = Calendar.getInstance();
    c.set(Calendar.HOUR_OF_DAY, hourOfDay);
    c.set(Calendar.MINUTE, minute);
    c.set(Calendar.SECOND, 0);

    updateTimeText(c);
    startAlarm(c);
}

private void updateTimeText(Calendar c) {
    String timeText = "Wir erinnern dich um ";
    timeText += DateFormat.getTimeInstance(DateFormat.SHORT).format(c.getTime());

    mTextView.setText(timeText);
}

private void startAlarm(Calendar c) {
    AlarmManager alarmManager = (AlarmManager) getContext().getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(getActivity(), AlertReceiver.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(getActivity(), 1, intent, 0);

    if (c.before(Calendar.getInstance())) {
        c.add(Calendar.DATE, 1);
    }

    alarmManager.setExact(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), pendingIntent);
}

private void cancelAlarm() {
    AlarmManager alarmManager = (AlarmManager) getContext().getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(getActivity(), AlertReceiver.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(getActivity(), 1, intent, 0);

    alarmManager.cancel(pendingIntent);
    mTextView.setText("Wir werden nicht stören!");
    }

我不确定您是否需要这些课程,但我也会向您展示,以防万一您需要它们。
AlarmTimePicker.java

public class AlarmTimePicker extends DialogFragment {

@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    Calendar c = Calendar.getInstance();
    int hour = c.get(Calendar.HOUR_OF_DAY);
    int minute = c.get(Calendar.MINUTE);
    return new TimePickerDialog(getActivity(), (TimePickerDialog.OnTimeSetListener) getParentFragment() , hour, minute, DateFormat.is24HourFormat(getActivity()));
    }
}

AlertReceiver.java

public class AlertReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
    NotificationHelper notificationHelper = new NotificationHelper(context);
    NotificationCompat.Builder nb = notificationHelper.getChannelNotification();
    notificationHelper.getManager().notify(1, nb.build());
    }
}

我尝试过的事情
我曾尝试用View.inflate()充胀,但不知道该如何写为Context&ViewGroup。还尝试了
View zz = inflate..无效,因此我在 NotificationHelper.java LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState的{​​{1}}的{​​{1}}之间写了(),但这在 AlertReceiver.java
我读了What is a NullPointerException, and how do I fix it?,我知道什么是NPE,但在这种特定情况下我不知道如何解决!
感谢所有试图帮助我解决此问题的人!

0 个答案:

没有答案