Изменить ImageView SRC от AlarmReceiver / Kotlin - PullRequest
0 голосов
/ 11 июня 2018

У меня есть приложение, которое имеет ImageView в MainActivity.И я пытаюсь сделать так, чтобы изображение сбрасывалось обратно на «поддержку» каждую полночь.Таким образом, в основном пользователь щелкает изображение, скажем, 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 голосов
/ 11 июня 2018
MainActivity().refreshdailycard()

Здесь вы ошиблись.Ваш ImageView - это часть вида активности, которая отображается на экране, когда активность отображается пользователю, а не при создании экземпляра активности.Делать это в AlaramManager - неправильный способ сделать это.Следуйте решению, предоставленному Йоси Прамаджайей.

0 голосов
/ 11 июня 2018

Вы упомянули это:

затем в следующий раз, когда он откроет приложение

Это означает, что вам не нужен AlarmReceiver для этого.

Кроме того, в вашем AlarmReceiver коде много ошибок.

Когда Android-система вызывает ваш AlarmReceiver, она работает в фоновом режиме и пытается вызвать ваш MainActivity (который даже не запускается, потому чтовы просто создаете его как объект), конечно, он выдаст NullPointerException.

Решение:

  1. Сохранено при последнем открытии пользователемваше приложение в SharedPreferences (скажем, оно называется savedDate).

  2. Всякий раз, когда пользователь снова открывает приложение, прежде чем показывать изображение или ежедневные открытки, проверьте, совпадает ли по-прежнему дата с вашим savedDate в вашем SharedPreferences.

  3. Если другой день, вы можете использовать refreshdailycard().Если это так, делай что хочешь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...