如何从 GestureListener onX 处理程序访问 ViewModel 对象



我正在编写一个简单的 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 类,因为您的视图模型无法接受触摸输入。这是由您的活动完成的。

相关内容

  • 没有找到相关文章

最新更新