如何将 R.drawable.XXX 值传递给 kotlin 中的函数?

How do I pass R.drawable.XXX value to a function in kotlin?

这是我的代码:

private fun roomChange(animation: Int)
{
    val rocketImage = findViewById<ImageView>(R.id.imageView2).apply {
        setBackgroundResource(R.drawable.animation)
        foxanim = background as AnimationDrawable
        foxanim.start()
    }
}

我有 anim.xml 文件并想将其传递给一个函数,但“动画”是一个未解决的引用。我将如何正确传递它?提前致谢!

R.drawable.whatever 只是一个整数。这就是您需要传递给 setBackgroundResource().

的全部内容

如果您希望 IDE 帮助您防止意外传递错误类型的参数,您还可以添加 @AnimRes。然后在某些情况下,当它检测到你传递的不是动画资源ID的Int时,它会报错。

private fun roomChange(@AnimRes animation: Int)
{
    val rocketImage = findViewById<ImageView>(R.id.imageView2).apply {
        setBackgroundResource(animation)
        foxanim = background as AnimationDrawable
        foxanim.start()
    }
}`

像这样修改您的代码:

private fun roomChange(animation: Drawable) {
    val rocketImage = findViewById<ImageView>(R.id.imageView2).apply {
        background = animation
        foxanim = background as AnimationDrawable
        foxanim.start()
    }
}

这是我在评论中提到的枚举:

// Basic enum with an animation resource property - add one for each anim
// The @AnimRes annotation is optional, just gives you a warning if you use something else
enum class StateAnimation(@AnimRes val animationId: Int) {
    ANIM(R.drawable.animation),
    RUN(R.drawable.run)
}

...

// set your function to take one of your animation definitions instead
private fun roomChange(stateAnim: StateAnimation) {
    // pull out the resource ID from the passed animation
    setBackgroundResource(stateAnim.animationId)
}

// call your function using the animation you want
roomChange(StateAnimation.RUN)

这里的想法是您可以创建一个枚举 class 来定义您的所有动画,这样您就可以根据自己的喜好命名每个动画,并且它们都具有它们所代表的动画的资源 ID。然后你将其中一个传递给你的函数,函数可以引用它的资源 ID

这样您就可以完成代码和类型检查(您必须传递 StateAnimation 之一,而不是任何其他动画 ID、资源 ID 或随机整数)。您的代码可以更清晰,因为 StateAnimation.RUN 非常清晰(您可能想重命名它,但您明白了),并且它比传递 "run" 之类的字符串并将其转换为资源查找更安全或者可能不存在

如果需要,您可以 import StateAnimation 中的所有内容(将光标放在 RUN 上并执行 Alt+Enter 或单击灯泡,它会愿意为您做这件事)然后您就可以打电话给 roomChange(RUN),这非常简洁!