从AlarmReceiver / Kotlin更改ImageView src

时间:2018-06-11 00:01:16

标签: java android android-studio kotlin

我有一个在其MainActivity中有ImageView的应用。而我正试图让图像重新恢复到每个午夜的“支持”。因此,基本上用户点击图像,比如5月24日,然后在下次打开应用程序时,它会检查是否是新的一天,并将图像重置为“支持”。我设法调用了AlarmReceiver。但是现在每当我尝试在cardback.setImageRes(R.drawable.backing)内使用refreshdailycard()时,它都会抛出NullPointerException。

任何帮助将不胜感激。

主要活动

 package com.example.godseye

import android.content.Intent
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_main.*
import java.util.*
import android.app.AlarmManager
import android.content.Context
import android.app.PendingIntent
import android.app.PendingIntent.getActivity
import android.support.constraint.ConstraintLayout
import android.widget.ImageView
import android.widget.TextView
import com.example.godseye.R.id.imageView



class MainActivity : AppCompatActivity() {
    var dailycardshown=" "


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        if(dailycardshown==" " )
        { cardback.setImageResource(R.drawable.backing) }
        if(cardback.drawable.constantState == resources.getDrawable(R.drawable.backing).constantState)
        { dailycardshown=" " }
        val singlecardintent = Intent(baseContext, SingleCard::class.java)
        val readingintent = Intent(baseContext, GetReading::class.java)
        val databaseintent = Intent(baseContext, TarotDatabase::class.java)
        val aboutintent = Intent(baseContext, ProjectAbout::class.java)
        cardback.setOnClickListener { _ ->
            if (dailycardshown == " ") {
                dailycardshown = choosedailycard()
                refreshdailycard()
                val res = resources
                val resID = res.getIdentifier(dailycardshown, "drawable", packageName)
                cardback.setImageResource(resID)
                setRecurringAlarm(baseContext)

            } else {
                singlecardintent.putExtra("card",dailycardshown)
                startActivity(singlecardintent)
            }
        }
        contrcontainer.setOnClickListener { _-> startActivity(readingintent) }
        database.setOnClickListener{ _-> startActivity(databaseintent)}
        aboutcontrainer.setOnClickListener { _-> startActivity(aboutintent)}
    }
    fun choosedailycard():String {
        val cardnames=resources.getStringArray(R.array.cardnames)
        var dailycard=ran(1,3)
        return cardnames[dailycard]


    }

    fun ran(from: Int, to: Int) : Int {
        val random = Random()
        return random.nextInt(to - from) + from
    }

    fun refreshdailycard(){
        dailycardshown= " "
    }

    private fun setRecurringAlarm(context: Context) {

        val updateTime = Calendar.getInstance()
        updateTime.timeZone = TimeZone.getTimeZone("GMT")
        updateTime.set(Calendar.HOUR_OF_DAY, 19)
        updateTime.set(Calendar.MINUTE, 54)
        val refresher = Intent(context, AlarmReceiver::class.java)
        val recurringDownload = PendingIntent.getBroadcast(context, 0, refresher, PendingIntent.FLAG_CANCEL_CURRENT)
        val alarms = baseContext.getSystemService(Context.ALARM_SERVICE) as AlarmManager
        alarms.setInexactRepeating(AlarmManager.RTC_WAKEUP, updateTime.timeInMillis, AlarmManager.INTERVAL_DAY, recurringDownload)
    }

}

警报接收器

package com.example.godseye

import android.content.Intent
import android.content.BroadcastReceiver
import android.content.Context
import android.util.Log


class AlarmReceiver : BroadcastReceiver()  {

    override fun onReceive(context: Context, intent: Intent) {
        Log.d(DEBUG_TAG, "Reccuring alarm for refresh backcard")
        val main = Intent(context, MainActivity::class.java)
        MainActivity().refreshdailycard()
    }

    companion object {

        private val DEBUG_TAG = "AlarmReceiver"
    }

}

2 个答案:

答案 0 :(得分:0)

你提到这个:

  

然后他下次打开应用程序

这意味着您不需要AlarmReceiver。

此外,您的AlarmReceiver代码有很多错误。

当Android系统调用你的AlarmReceiver时,它会在后台运行,当它试图调用你的MainActivity(它甚至没有启动时,因为你只是将它实例化为一个对象),当然它将抛出NullPointerException

<强>解决方案:

  1. 上次用户在SharedPreferences打开您的应用时保存了(假设它叫做savedDate)。

  2. 每当用户再次打开应用时,在您展示图片或每日卡片之前,请检查您的savedDate中的SharedPreferences是否仍然是同一天。

    < / LI>
  3. 如果是不同的一天,您可以使用refreshdailycard()。如果它是相同的,做任何你想做的事。

答案 1 :(得分:0)

MainActivity().refreshdailycard()

这是你弄错了。您的ImageView是活动视图的一部分,当向用户显示活动时,不会在创建活动实例时将其显示在屏幕上。在AlaramManager中执行它是一种错误的方法。遵循Yosi Pramajaya提供的解决方案。