首页 > 解决方案 > 如何使用 OnLongClickListener 更改 ImageView 图像并使用 Kotlin 保存状态

问题描述

我是 Android 开发的新手。我正在用 Kotlin 做这件事。我得到了一项使用 OnLongClickListener 更改 imageView 图像的任务,例如每次长按更改两到三个图像。另外,我想在旋转屏幕后保存图像的状态。我将其设置为一次将一张图像更改为另一张图像,但仍然对如何正确执行此操作感到困惑。

override fun onCreate(savedInstanceState: Bundle?) {

    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    lightMe.setOnLongClickListener {
        lightMe.run {

            lightMe.setImageDrawable(getDrawable(R.drawable.ic_baseline_flare_24))
            lightMe.setImageDrawable(getDrawable(R.drawable.ic_baseline_wb_incandescent_24))
                true
        }
    }

}

override fun onSaveInstanceState(outState: Bundle) {
    super.onSaveInstanceState(outState)

}

标签: androidkotlinonlongclicklistener

解决方案


检查这个例子。我添加了一个ImageView,我正在长按更改图像。

MainActivity.kt:

import android.os.Bundle
import android.util.Log
import androidx.annotation.DrawableRes
import androidx.appcompat.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

    companion object {
        const val IMAGE_ID_KEY = "IMAGE_ID_KEY" //key to save imageId
    }

    @DrawableRes
    private var imageId = R.drawable.ic_launcher_foreground //field which keeps actual drawable id
        set(value) {
            field = value
            image.setImageResource(value) //every time value is changed, ImageView is updated
        }


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

        Log.d("MY_TAG", "onCreate")

        image.setOnLongClickListener {
            Log.d("MY_TAG", "longClick")
            // change image to the opposite
            imageId =
                if (imageId == R.drawable.ic_launcher_background) R.drawable.ic_launcher_foreground else R.drawable.ic_launcher_background
            
            true
        }
    }

    // saving imageId before app can be destroyed. E.g. rotation
    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        Log.d("MY_TAG", "onSaveInstanceState")
        outState.putInt(IMAGE_ID_KEY, imageId)
    }

    // restoring imageId every time app is recreating
    override fun onRestoreInstanceState(savedInstanceState: Bundle) {
        super.onRestoreInstanceState(savedInstanceState)
        Log.d("MY_TAG", "onRestoreInstanceState")
        imageId = savedInstanceState.getInt(IMAGE_ID_KEY)
    }
}

main_activity.xml(只是一张图片):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:src="@drawable/ic_launcher_foreground"
        android:id="@+id/image"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

推荐阅读