键入的文本不会显示在通知中

问题描述 投票:0回答:1

我创建了一个应用程序,允许您输入通知的内容并选择应显示通知的日期和时间。一切正常,除了用户在 EditText 中输入的文本不会出现在显示的通知中。怎么解决呢?预先感谢您!

主要活动

package com.example.kalendarz_2

import android.annotation.SuppressLint
import android.app.AlarmManager
import android.app.DatePickerDialog
import android.app.PendingIntent
import android.content.Context
import android.content.Intent
import android.os.Build
import android.os.Bundle
import android.view.View
import android.widget.Button
import android.widget.DatePicker
import android.widget.EditText
import android.widget.TimePicker
import android.app.TimePickerDialog
import android.widget.Toast
import androidx.annotation.RequiresApi
import androidx.appcompat.app.AppCompatActivity
import java.util.*



class MainActivity : AppCompatActivity() {

    private lateinit var alarmManager: AlarmManager

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // Inicjalizacja alarmManager
        alarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager
    }

    @RequiresApi(Build.VERSION_CODES.S)
    fun showDateTimePicker(view: View) {
        val calendar = Calendar.getInstance()
        val initialYear = calendar.get(Calendar.YEAR)
        val initialMonth = calendar.get(Calendar.MONTH)
        val initialDay = calendar.get(Calendar.DAY_OF_MONTH)
        val initialHour = calendar.get(Calendar.HOUR_OF_DAY)
        val initialMinute = calendar.get(Calendar.MINUTE)

        val datePickerDialog = DatePickerDialog(this, { _, year, month, day ->
            val timePickerDialog = TimePickerDialog(this, { _, hourOfDay, minute ->
                setReminder(year, month, day, hourOfDay, minute)
            }, initialHour, initialMinute, true)
            timePickerDialog.show()
        }, initialYear, initialMonth, initialDay)

        datePickerDialog.show()
    }

    @RequiresApi(Build.VERSION_CODES.S)
    private fun setReminder(year: Int, month: Int, day: Int, hourOfDay: Int, minute: Int) {
        val calendar = Calendar.getInstance()
        calendar.set(year, month, day, hourOfDay, minute)

        if (calendar.timeInMillis > System.currentTimeMillis()) {
            if (alarmManager.canScheduleExactAlarms()) {
                val reminderIntent = Intent(this, ReminderReceiver::class.java)
                reminderIntent.putExtra("REMINDER_TEXT", "Treść przypomnienia")
                reminderIntent.putExtra("REMINDER_TIME", calendar.timeInMillis)
                val pendingIntent = PendingIntent.getBroadcast(
                    this, 0, reminderIntent, PendingIntent.FLAG_IMMUTABLE
                )

                alarmManager.setExactAndAllowWhileIdle(
                    AlarmManager.RTC_WAKEUP,
                    calendar.timeInMillis,
                    pendingIntent
                )

                Toast.makeText(
                    this,
                    "Notification set at: ${calendar.time}",
                    Toast.LENGTH_SHORT
                ).show()
            } else {
                // Handle the case where the device doesn't support exact alarms
                Toast.makeText(this, "Device doesn't support exact alarms", Toast.LENGTH_SHORT).show()
            }
        } else {
            Toast.makeText(this, "Enter date from the future", Toast.LENGTH_SHORT).show()
        }
    }
}

提醒接收器

package com.example.kalendarz_2

import android.app.Notification
import android.app.NotificationChannel
import android.app.NotificationManager
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.os.Build
import android.util.Log
import android.widget.Toast
import androidx.core.app.NotificationCompat
import com.example.kalendarz_2.R

class ReminderReceiver : BroadcastReceiver() {

    override fun onReceive(context: Context?, intent: Intent?) {
        Log.d("ReminderReceiver", "Received reminder broadcast")

        val reminderText = intent?.getStringExtra("REMINDER_TEXT") ?: "No content notification"
        val reminderTime = intent?.getLongExtra("REMINDER_TIME", 0) ?: 0

        Log.d("ReminderReceiver", "Reminder text: $reminderText")
        Log.d("ReminderReceiver", "Reminder time: $reminderTime")

        val currentTime = System.currentTimeMillis()

        if (reminderTime > currentTime) {
            showReminderNotification(context, reminderText)
        } else {
            Toast.makeText(context, "Notification: $reminderText", Toast.LENGTH_LONG).show()
        }
    }

    private fun showReminderNotification(context: Context?, reminderText: String) {
        val notificationManager =
            context?.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager

        val notificationChannelId = "channel_id"
        val notificationBuilder = NotificationCompat.Builder(context, notificationChannelId)
            .setContentTitle("Notification")
            .setContentText("Notification: $reminderText")
            .setSmallIcon(R.mipmap.ic_launcher)
            .setAutoCancel(true)

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            val notificationChannel = NotificationChannel(
                notificationChannelId,
                "Notifications",
                NotificationManager.IMPORTANCE_HIGH
            )
            notificationManager.createNotificationChannel(notificationChannel)
            notificationBuilder.setChannelId(notificationChannelId)
        }

        notificationManager.notify(1, notificationBuilder.build())
    }
}

提醒服务

package com.example.kalendarz_2


import android.app.Notification
import android.app.NotificationChannel
import android.app.NotificationManager
import android.app.PendingIntent
import android.app.Service
import android.content.Context
import android.content.Intent
import android.os.Build
import android.os.IBinder
import android.util.Log
import androidx.annotation.RequiresApi

class ReminderService : Service() {

    override fun onBind(intent: Intent?): IBinder? {
        return null
    }

    @RequiresApi(Build.VERSION_CODES.O)
    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        Log.d("ReminderService", "Reminder service started")
        showReminderNotification(intent?.getStringExtra("REMINDER_TEXT") ?: "no reminder content")

        return START_STICKY
    }

    @RequiresApi(Build.VERSION_CODES.O)
    private fun showReminderNotification(reminderText: String) {
        val notificationManager =
            getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager

        val channelId = "channel_id"
        val channelName = "Reminders"
        val importance = NotificationManager.IMPORTANCE_HIGH

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            val channel = NotificationChannel(channelId, channelName, importance)
            notificationManager.createNotificationChannel(channel)
        }

        val notificationIntent = Intent(this, MainActivity::class.java)
        val pendingIntent = PendingIntent.getActivity(
            this, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT
        )

        val notificationBuilder = Notification.Builder(this, channelId)
            .setContentTitle("Reminder")
            .setContentText(reminderText)
            .setSmallIcon(android.R.drawable.ic_lock_idle_alarm)
            .setContentIntent(pendingIntent)
            .setAutoCancel(true)

        notificationManager.notify(1, notificationBuilder.build())
    }
}

android kotlin notifications android-edittext android-textinputedittext
1个回答
0
投票
  • 首先,您必须从用户输入通知文本的EditText 获取文本。假设您有一个带有 ID 提醒编辑文本的 EditText。你会得到这样的文字:
val editTextR = findByView<EditText>(R.id.reminderEditText) 
val userText = reminderEditText.text.toString()
  • 其次,将输入文本传递给Intent:
reminderIntent.putExtra("REMINDER_TEXT", userText)

方法设置提醒:

@RequiresApi(Build.VERSION_CODES.S)
private fun setReminder(year: Int, month: Int, day: Int, hourOfDay: Int, minute: Int) {
    val calendar = Calendar.getInstance()
    calendar.set(year, month, day, hourOfDay, minute)

    if (calendar.timeInMillis > System.currentTimeMillis()) {
        if (alarmManager.canScheduleExactAlarms()) {
            val reminderIntent = Intent(this, ReminderReceiver::class.java)
            val editTextReminder = findViewById<EditText>(R.id.reminderEditText)
            val userText = editTextReminder.text.toString()
            reminderIntent.putExtra("REMINDER_TEXT", userText)
            reminderIntent.putExtra("REMINDER_TIME", calendar.timeInMillis)
            val pendingIntent = PendingIntent.getBroadcast(
                this, 0, reminderIntent, PendingIntent.FLAG_IMMUTABLE
            )

            alarmManager.setExactAndAllowWhileIdle(
                AlarmManager.RTC_WAKEUP,
                calendar.timeInMillis,
                pendingIntent
            )

            Toast.makeText(
                this,
                "Notification set at: ${calendar.time}",
                Toast.LENGTH_SHORT
            ).show()
        } else {
            Toast.makeText(this, "Device doesn't support exact alarms", Toast.LENGTH_SHORT).show()
        }
    } else {
        Toast.makeText(this, "Enter date from the future", Toast.LENGTH_SHORT).show()
    }
}

请记住将 R.id.reminderEditText 替换为布局中 EditText 的实际 ID。

© www.soinside.com 2019 - 2024. All rights reserved.