我有一个在其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"
}
}
答案 0 :(得分:0)
你提到这个:
然后他下次打开应用程序
这意味着您不需要AlarmReceiver。
此外,您的AlarmReceiver
代码有很多错误。
当Android系统调用你的AlarmReceiver
时,它会在后台运行,当它试图调用你的MainActivity
(它甚至没有启动时,因为你只是将它实例化为一个对象),当然它将抛出NullPointerException
。
<强>解决方案:强>
上次用户在SharedPreferences
打开您的应用时保存了(假设它叫做savedDate
)。
每当用户再次打开应用时,在您展示图片或每日卡片之前,请检查您的savedDate
中的SharedPreferences
是否仍然是同一天。
如果是不同的一天,您可以使用refreshdailycard()
。如果它是相同的,做任何你想做的事。
答案 1 :(得分:0)
MainActivity().refreshdailycard()
这是你弄错了。您的ImageView是活动视图的一部分,当向用户显示活动时,不会在创建活动实例时将其显示在屏幕上。在AlaramManager中执行它是一种错误的方法。遵循Yosi Pramajaya提供的解决方案。