android - 如何使用 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)
}
解决方案
检查这个例子。我添加了一个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>
推荐阅读
- python - 如何在python中选择特定类别的垃圾箱?
- python - 澄清 keras 中的 Conv2D() 语法
- python - 如何创建一个在单击时将 HTTP GET 请求发送到安全 URL 的按钮?
- codenameone - 在给定位置记录组件层次结构
- react-native - 如何修复 react-native 中的 'boost/operators.hpp' file not found' 错误
- c# - 无法打开数据库文件(误用)SqlLiteAsyncConnection
- html - 如何使一行图像成为垂直和水平居中的div?
- java - 通过单击信息窗口打开活动
- react-native - 尝试在 Windows 命令行中运行“gradlew assembleRelease”时出错:jest-haste-map: Haste 模块命名冲突
- ios - 从 CMPedometer 检索数据时出现问题:“消息回复错误(连接无效)”