我正在编写一个简单的 Kotlin Android 应用程序,该应用程序必须在屏幕上显示图像并使用手势滚动列表,具体地说是 Fling。我是 Android 开发和 Kotlin 的新手。
我正在使用 ViewModel 派生类来存储应用信息。
我已经能够显示图像并使用按钮滚动列表。按下按钮时,ViewModel 中将显示图像在图像列表中的位置的计数器。为此,我使用了数据绑定。
但是,当我实现手势检测逻辑时,我意识到从 onFling 方法内部我无法访问 ViewModel 数据,因此我无法更新计数器,因此无法与应用状态进行交互。onFling 方法被正确调用,我有足够的信息来实现逻辑,但没有权限来修改 ViewModel 中的数据。
我相信一定有办法做到这一点,但我找不到办法。
如果没有修改ViewModel数据的可能性,所有手势框架似乎都毫无用处。
我不认为我的代码会澄清这个问题,但我可以根据要求发布它。(谢谢@Andy(
这是活动类代码:
class MainActivity : AppCompatActivity() {
private val _data: AppData by viewModels()
private lateinit var _binding: ActivityMainBinding
private lateinit var _detector: GestureDetectorCompat
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
_binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
// Binding app data to the View
_binding.lifecycleOwner = this
_binding.data = _data
// Check permissions
.
. Irrelevant code
.
// Initialize gesture Listener
_detector = GestureDetectorCompat(this, MyGestureListener())
val focusImage: ImageView = findViewById(R.id.photo_focus)
focusImage.setOnTouchListener {_ , event -> _detector.onTouchEvent(event) }
// Load the available photos
.
. Irrelevant code
.
}
private class MyGestureListener: GestureDetector.SimpleOnGestureListener() {
override fun onDown(event: MotionEvent): Boolean {
Log.d("Gesture", "onDown: $event")
return true
}
override fun onFling(
event1: MotionEvent,
event2: MotionEvent,
velocityX: Float,
velocityY: Float
): Boolean {
Log.d("Gesture", "onFling: $event1 $event2 $velocityX $velocityY")
// NO ACCESS TO ViewModel!!!
// I will like to do something like
val data = some_way_get_ViewModel()
if (velocityX > 1000)
data.moveNext()
if (velocityZ < -1000)
data.movePrev()
return true
}
}
}
提前感谢您的帮助。
这个问题仍然悬而未决吗?如果是这样,我只是遇到了类似的问题,并自己找到了解决方案。
你可以将 viewModel 构造函数添加到 MyGestureListener 类中,如下所示:
private class MyGestureListener(private val viewModel: MainActivityVM?):
GestureDetector.SimpleOnGestureListener() {
override fun onDoubleTap(e: MotionEvent?): Boolean {
viewModel?.yourMutableLiveData?.value = true
return true
}
// You can call other override methods too.
}
然后在主活动中传递视图模型,如下所示:
// Initialize gesture Listener
_detector = GestureDetectorCompat(this, MyGestureListener(_binding.data))
您的视图模型本身无法扩展 GestureDetector 类,因为您的视图模型无法接受触摸输入。这是由您的活动完成的。