android - 使用 RxAndroid 处理 onKeyDown

标签 android kotlin rx-java2 viper-architecture

我正在使用https://github.com/mkoslacz/Moviper我的 Android 电视盒应用程序。只有一项 Activity 具有多个子 fragment 。仅当事件尚未处理时,我才想将 onKeyDown 传播到子 fragment 。无需使用 RxJava 即可轻松完成。我可以返回一个 bool 值来告诉事件是否已处理。有没有办法使用 RxJava 来处理它?我使用 Kotlin 作为源语言。这是我正在尝试做的事情。

class MainActivity : ViperAiPassiveActivity<HomeContract.View>(), HomeContract.View {

private val keyPressSubject = BehaviorSubject.create<KeyEvent>()
private lateinit var predicate: (KeyEvent) -> Boolean

override fun keyPresses(predicate: (KeyEvent) -> Boolean): Observable<KeyEvent> {
    this.predicate = predicate
    return keyPressSubject
}


override fun createPresenter() = HomePresenter()

override fun getLayoutId(): Int {
    return R.layout.activity_main
}

override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
    event?.run {
        if (predicate(event)) {
            keyPressSubject.onNext(event)
            return true
        }
    }
    return super.onKeyDown(keyCode, event)
}
}

最佳答案

我最终创建了自己的事件处理程序(虽然它没有使用 RxJava,但它在我的情况下完成了工作)

object KeyEventManager {

private val handlers: MutableMap<Int, (KeyEvent?) -> Boolean> = ArrayMap()

fun register(handler: (KeyEvent?) -> Boolean): Int {
    val id = (handlers.keys.max() ?: 0) + 1
    handlers.put(id, handler)
    return id
}

fun unregister(id: Int) {
    handlers.remove(id)
}

fun postEvent(event: KeyEvent?): Boolean {
    for (key in handlers.keys) {
        handlers.get(key)?.run {
            if (invoke(event)) {
                return true
            }
        }
    }
    return false
}

}

关于android - 使用 RxAndroid 处理 onKeyDown,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47413064/

相关文章:

android - 如何更改android中menuItem的背景颜色?

android - Ktor 客户端的 JsonFeature 未解决

android - Kotlin - 可能错误地报告未使用的代码

java - RxJava - 两个可观察对象

java - RxJava 在第一个 Completable 之后但在返回下一个单个之前更新数据

java - 字符串到 JSON (android)

android - 如何在 android kotlin 中更改 onScrollChanged 上的选项卡

javascript - Android onOrientationChange 在方向完成之前触发(太早)

kotlin - Kotlin 数据类是否默认可序列化?

android - 使用 MVVM 在 Android 中验证权限的优雅方式