使用 RxAndroid 处理 onKeyDown
handle onKeyDown using RxAndroid
我正在为 Android 电视盒的应用程序使用 https://github.com/mkoslacz/Moviper。只有一个 activity 具有多个子片段。仅当事件尚未处理时,我才想将 onKeyDown 传播到子片段。不使用 RxJava 也很容易做到。我可以 return 一个布尔值来判断事件是否已经处理。有没有一种方法可以使用 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 电视盒的应用程序使用 https://github.com/mkoslacz/Moviper。只有一个 activity 具有多个子片段。仅当事件尚未处理时,我才想将 onKeyDown 传播到子片段。不使用 RxJava 也很容易做到。我可以 return 一个布尔值来判断事件是否已经处理。有没有一种方法可以使用 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
}
}