如何在Android上创建通过数组的通知?

如何在Android上创建通过数组的通知?,android,arrays,kotlin,notifications,Android,Arrays,Kotlin,Notifications,我是编程的初学者!我正在尝试创建一个在特定时间发送通知的应用程序。通知的描述必须来自先前在应用程序中定义的数组。 现在,我正在分部分进行:通知是由WorkManager创建的,它由一个按钮激活。目前,这是一个一次性的工作请求 我现在的问题是:如何获取通知以从数组中获取其描述?我尝试使用while循环,但它只使用数组中的第一个字符串 我的活动代码: class CatPicsActivity : AppCompatActivity() { lateinit var notifBtn: Mater

我是编程的初学者!我正在尝试创建一个在特定时间发送通知的应用程序。通知的描述必须来自先前在应用程序中定义的数组。 现在,我正在分部分进行:通知是由WorkManager创建的,它由一个按钮激活。目前,这是一个一次性的工作请求

我现在的问题是:如何获取通知以从数组中获取其描述?我尝试使用while循环,但它只使用数组中的第一个字符串

我的活动代码:

class CatPicsActivity : AppCompatActivity() {

lateinit var notifBtn: MaterialButton;
lateinit var catBtn: ImageButton;
lateinit var title: String;
lateinit var catImg: ImageView;
var url: String = "https://api.thecatapi.com/v1/"

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

    notifBtn = findViewById(R.id.botaoNotificacao);
    catBtn = findViewById(R.id.catbtn);
    catImg = findViewById(R.id.imgCat);

    title = getResources().getString(R.string.titulo_notificacao);

    notifBtn.setOnClickListener {


        Log.i("WorkButton", "clicado")

        val notifcWorker: OneTimeWorkRequest =
                OneTimeWorkRequestBuilder<NotificationWorker>()
                        .build()

        WorkManager.getInstance(this)
                .enqueueUniqueWork(
                        "notification_worker",
                        ExistingWorkPolicy.KEEP,
                        notifcWorker
                )
    }

    catBtn.setOnClickListener {
        catFunction();
    }
}

private fun catFunction() {
    val retrofit = Retrofit.Builder()
            .baseUrl(url)
            .addConverterFactory(GsonConverterFactory.create())
            .build()

    val catService: CatService = retrofit.create(CatService::class.java)
    catService.randomCat().enqueue(object : Callback<List<Cat>> {
        override fun onResponse(call: Call<List<Cat>>, response: Response<List<Cat>>) {
            val randomCat = response.body()!!

            Picasso.get()
                    .load(randomCat[0].url)
                    .into(catImg)
        }

        override fun onFailure(call: Call<List<Cat>>, t: Throwable) {
            Toast.makeText(this@CatPicsActivity, "Deu errado! Tente novamente, por favor", Toast.LENGTH_SHORT).show()
            Log.i("CatPics", "Erro: $t")
        }
    })

}}
类CatPicsActivity:AppCompativity(){ lateinit var notifBtn:MaterialButton; lateinit var catBtn:ImageButton; lateinit变量标题:字符串; lateinit var catImg:ImageView; 变量url:字符串=”https://api.thecatapi.com/v1/" 重写创建时的乐趣(savedInstanceState:Bundle?){ super.onCreate(savedInstanceState) setContentView(R.layout.activity\u cat\u图片) notifBtn=findviewbyd(R.id.botaoNotificacao); catBtn=findViewById(R.id.catBtn); catImg=findViewById(R.id.imgCat); title=getResources().getString(R.string.titulo_notificacao); notifBtn.setOnClickListener{ Log.i(“工作按钮”、“clicado”) val notifcWorker:OneTimeWorkRequest= OneTimeWorkRequestBuilder() .build() WorkManager.getInstance(此) .排队唯一工作( “通知工作人员”, ExistingWorkPolicy.KEEP, 通知工 ) } catBtn.setOnClickListener{ catFunction(); } } 私人娱乐功能(){ val reformation=reformation.Builder() .baseUrl(url) .addConverterFactory(GsonConverterFactory.create()) .build() val-catService:catService=reformation.create(catService::class.java) catService.randomCat().enqueue(对象:回调{ 覆盖fun onResponse(调用:调用,响应:响应){ val randomCat=响应。体()!! 毕加索 .load(randomCat[0].url) .into(catImg) } 覆盖失效时的乐趣(调用:调用,t:可丢弃){ Toast.makeText(this@CatPicsActivity,“Deu errado!Tent Novatement,por Love”,吐司。长度(短)。show() Log.i(“CatPics”,“Erro:$t”) } }) }} 我的工人阶级:

class NotificationWorker(private val context: Context, params: WorkerParameters) : Worker(context, params) {


lateinit var descricao: String

fun generateDescription (): String {
    var razoes = arrayOf(
            "Esta é uma notificação de teste, por favor me avise no Telegram se chegou",
            "1 - ",
            "2 - ",
            "3 - ",
            "4 - ",
            "5 - ",
            "6 - ",
            "7 - ",
            "8 - ",
            "9 - ",
            "10 - ",
            "11 - ",
            "12 - ",
            "13 - ",
            "14 - ",
            "15 - ",
            "16 - ",
            "17 - ",
            "18 - ",
            "19 - ",
            "20 - ",
            "21 - ",
            "22 - ",
            "23 - ",
            "24 - ",
            "25 - ",
            "26 - ",
            "27 - ",
            "28 - ",
            "29 - ",
            "30 - ")

    var array = razoes
    var i = 0

    while(i < array.size){
        descricao = array[i]
        i += 1
        return descricao
    }

    return descricao
}

var title: String = "Você recebeu uma nova mensagem!"

override fun doWork(): Result {

    generateDescription()
    Log.i("WorkerDescricao2", descricao)
    Log.i("WorkBeforeNotification", "Trabalho criado")

    NotificationUtils.createNotification(context, title, descricao)

    Log.i("WorkAfterNotification", "notificação enviada")

    return Result.success()

}}
class NotificationWorker(私有val上下文:上下文,参数:WorkerParameters):Worker(上下文,参数){
lateinit变量描述符:字符串
fun generateDescription():字符串{
var razoes=arrayOf(
“请允许我不要给你打电报”,
"1 - ",
"2 - ",
"3 - ",
"4 - ",
"5 - ",
"6 - ",
"7 - ",
"8 - ",
"9 - ",
"10 - ",
"11 - ",
"12 - ",
"13 - ",
"14 - ",
"15 - ",
"16 - ",
"17 - ",
"18 - ",
"19 - ",
"20 - ",
"21 - ",
"22 - ",
"23 - ",
"24 - ",
"25 - ",
"26 - ",
"27 - ",
"28 - ",
"29 - ",
"30 - ")
var数组=razoes
变量i=0
while(i
那么,如何从数组“razoes”中获取“descripao”变量呢

谢谢大家!

编辑:


我希望在不同的通知中使用数组中的每个值,该通知将在单击按钮后发送(或以后每天发送)。

在代码中,while循环中有一个返回。因此,在第一次迭代中,您将退出while循环,并在
descripa
变量中返回
razoes[0]
的值。此外,无需使用额外阵列,您可以立即访问razoes:

 var i = 0
    while(i < razoes.size) {
        descricao = razoes[i]
        i += 1
        //return descricao
    }
如果我理解正确,您希望在每次下一个剃须刀阵列项目时单击按钮发送一个带有说明的通知。下面是一个处理click按钮的示例(为了显示逻辑,我使用了一条伪消息):


我认为您试图做的是让
generateDescription()
函数在每次调用它时继续while循环中停止的地方。函数根本不是这样工作的。每次您调用它们时,它们都会从一开始就运行(没有以前调用过的任何内存),直到遇到
return

所以你必须保留一个跟踪你离开的地方的属性。因此,对代码进行最小更改并使其正常工作的方法是创建一个属性,跟踪下一步要显示的数组索引。每次调用此函数时,都会增加此变量,并使用它获取数组的下一个值。要使它在到达数组末尾时返回到数组的开头,可以对数组大小使用余数运算符
%

您可以去掉
descripaO
属性,因为它除了保存此函数调用的结果之外,没有其他用途。可以使用局部变量将结果保存在使用它的位置

我使用迭代器使数组的创建更加简洁,但我意识到您可能计划每天更改值,因此您将无法
fun generateDescription(position: Int): String {
    var razoes = arrayOf(
            "Esta é uma notificação de teste, por favor me avise no Telegram se chegou",
            "1 - ",
            "2 - ",
            "3 - ",
            "4 - ",
            "5 - ",
            "6 - ",
            "7 - ",
            "8 - ",
            "9 - ",
            "10 - ",
            "11 - ",
            "12 - ",
            "13 - ",
            "14 - ",
            "15 - ",
            "16 - ",
            "17 - ",
            "18 - ",
            "19 - ",
            "20 - ",
            "21 - ",
            "22 - ",
            "23 - ",
            "24 - ",
            "25 - ",
            "26 - ",
            "27 - ",
            "28 - ",
            "29 - ",
            "30 - ")
    descricao = razoes[position]
    return descricao
}
private var razoes = intArrayOf(1, 2, 3, 4, 5)
private var position: Int = -1

 binding.button.setOnClickListener {
            handleButtonClick()
        }

 private fun handleButtonClick() {
        position += 1
        if (position > razoes.size -1) {
            Toast.makeText(this@DemoActivity, "There are no other items in razoes", Toast.LENGTH_SHORT).show()
        } else {
            Toast.makeText(this@DemoActivity, razoes[position].toString(), Toast.LENGTH_SHORT).show()
        }
    }
private var notificationIndex = -1

fun generateDescription (): String {
    val razoes = Array<String>(31) {
        if (it == 0)
            "Esta é uma notificação de teste, por favor me avise no Telegram se chegou"
        else
            "$it - "
    }
    notificationIndex = (notificationIndex + 1) % razoes.size
    return razoes[notificationIndex]
}

override fun doWork(): Result {

    val descricao = generateDescription()
    Log.i("WorkerDescricao2", descricao)
    Log.i("WorkBeforeNotification", "Trabalho criado")

    NotificationUtils.createNotification(context, title, descricao)

    Log.i("WorkAfterNotification", "notificação enviada")

    return Result.success()

}