Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/221.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java RxAndroid:观察编辑文本,同时观察两个视图上的触摸_Java_Android_Rx Java_Rx Android_Reactivex - Fatal编程技术网

Java RxAndroid:观察编辑文本,同时观察两个视图上的触摸

Java RxAndroid:观察编辑文本,同时观察两个视图上的触摸,java,android,rx-java,rx-android,reactivex,Java,Android,Rx Java,Rx Android,Reactivex,让我来为一个需要我几天才能弄明白的小任务开动脑筋 我有一个EditText,用户将输入一个字符串,用于进行Wikipedia搜索,并向ListView提供结果。EditText应具有1秒的限制,并且必须进行过滤,以便使用“不适当”字符串列表进行检查。如果输入在该字符串列表中,搜索将不会进行,除非用户同时触摸屏幕两个角上的两个隐藏视图,否则将跳过此检查 这里有一些片段可以帮助你理解我已经拥有的东西 // a list of inappropriate content private static

让我来为一个需要我几天才能弄明白的小任务开动脑筋

我有一个EditText,用户将输入一个字符串,用于进行Wikipedia搜索,并向ListView提供结果。EditText应具有1秒的限制,并且必须进行过滤,以便使用“不适当”字符串列表进行检查。如果输入在该字符串列表中,搜索将不会进行,除非用户同时触摸屏幕两个角上的两个隐藏视图,否则将跳过此检查

这里有一些片段可以帮助你理解我已经拥有的东西

// a list of inappropriate content
private static String[] INAPPROPRIATE_CONTENT = {
            "test"
        };

// subscription to the touches happening on hidden view #1
Subscription subSecretLeft = RxView.touches(vSecretLeft)
        .filter(motionEvent -> motionEvent.getAction() == MotionEvent.ACTION_DOWN || motionEvent.getAction() == MotionEvent.ACTION_UP)
        .subscribe(motionEvent -> secretLeftClicked = motionEvent.getAction() == MotionEvent.ACTION_DOWN);

// subscription to the touches happening on hidden view #2
RxView.touches(vSecretRight)
        .filter(motionEvent -> motionEvent.getAction() == MotionEvent.ACTION_DOWN || motionEvent.getAction() == MotionEvent.ACTION_UP)
        .subscribe(motionEvent -> secretRightClicked = motionEvent.getAction() == MotionEvent.ACTION_DOWN);

// subscription to the EditText
RxTextView.textChanges(etxtSearchFilter)
        .throttleLast(1, TimeUnit.SECONDS, AndroidSchedulers.mainThread())
        .map(c -> c.toString().trim())
        .filter(s -> !(s.isEmpty() || isInappropriate(s)))
        .subscribe(s -> fetchWikiSearch(s));
其中,isInappropriate(字符串s)是检查是否在数组中找到术语的方法,fetchWikiSearch(字符串s)执行搜索并填充ListView

我尝试了几种方法,最后一种方法是:

Observable.zip(
        Observable.combineLatest(
                RxView.touches(vSecretLeft)
                        .filter(motionEvent -> motionEvent.getAction() == MotionEvent.ACTION_DOWN || motionEvent.getAction() == MotionEvent.ACTION_UP || motionEvent.getAction() == MotionEvent.ACTION_CANCEL),
                RxView.touches(vSecretRight)
                        .filter(motionEvent -> motionEvent.getAction() == MotionEvent.ACTION_DOWN || motionEvent.getAction() == MotionEvent.ACTION_UP || motionEvent.getAction() == MotionEvent.ACTION_CANCEL),
                (ev1, ev2) -> ev1.getAction() == MotionEvent.ACTION_DOWN && ev2.getAction() == MotionEvent.ACTION_DOWN
        ).asObservable(),
        RxTextView.textChanges(etxtSearchFilter)
                .throttleLast(1, TimeUnit.SECONDS, AndroidSchedulers.mainThread())
                .map(c -> c.toString().trim())
                .filter(s -> !s.isEmpty()),
        (overrideFilter, s) ->
                overrideFilter || !isInappropriate(s) ? s : "BLOCKED"
).subscribe(s -> Log.i("ObservableZip", "s: " + s));
但很明显,只要我不接触这些视图,它就不会发出任何东西。即使是Observable.combileLatest()也不能很好地工作,因为只有当两个视图都获得MotionEvent.ACTION\u关闭时,它才会发出声音


如果您有任何建议或实际解决方案,请随时发表评论。谢谢。

这还不够吗

Observable.combineLatest(
        RxView.touches(vSecretLeft)
                .filter(motionEvent -> motionEvent.getAction() == MotionEvent.ACTION_DOWN || motionEvent.getAction() == MotionEvent.ACTION_UP || motionEvent.getAction() == MotionEvent.ACTION_CANCEL),
        RxView.touches(vSecretRight)
                .filter(motionEvent -> motionEvent.getAction() == MotionEvent.ACTION_DOWN || motionEvent.getAction() == MotionEvent.ACTION_UP || motionEvent.getAction() == MotionEvent.ACTION_CANCEL),
        RxTextView.textChanges(etxtSearchFilter)
                .debounce(1, TimeUnit.SECONDS)
                .map(c -> c.toString().trim())
                .filter(s -> !s.isEmpty()),
        (motionEventLeft, motionEventRight, entered) -> {
            boolean overrideFilter = motionEventLeft.getAction() == MotionEvent.ACTION_DOWN && motionEventRight.getAction() == MotionEvent.ACTION_DOWN;
            return overrideFilter || !isInappropriate(entered) ? entered : "BLOCKED";
        })
        .subscribe(s -> Log.i("ObservableCombineLatest", "s: " + s));
(我还将
throttleLast
更改为
debounce
,因为这样做感觉更好)

编辑
您似乎在正确的轨道上,但您可能希望使用
startsWith
来“初始化”隐藏视图

// subscription to the touches happening on hidden view #1
Subscription subSecretLeft = RxView.touches(vSecretLeft)
        .filter(motionEvent -> motionEvent.getAction() == MotionEvent.ACTION_DOWN || motionEvent.getAction() == MotionEvent.ACTION_UP)
        .startsWith(MotionEvent.ACTION_UP)
        .subscribe(motionEvent -> secretLeftClicked = motionEvent.getAction() == MotionEvent.ACTION_DOWN);

谢谢你的回答,我也试过了,但是只有当两个第一个观测到的东西也发射时,整个观测到的东西才会发射出来。所以,如果我写“test”,我需要接触这两个视图才能得到结果。我需要的是,如果不合适,它能够发出用“BLOCKED”更改的文本,但是如果两个视图都被触碰,则跳过isInappropriate()部分。您所写的东西并不完全正确:“Observable仅当两个第一个Observable也这样做时才会发出某些东西”。
combinelatetest
作为根转换(而不是
zip
)的全部目的是,如果其中任何一个发出某种东西,它就会发出。但我确实看到了一个小问题,即您需要确保两个第一个
可观察对象
发射任何东西,以便
组合测试
完全按照预期工作(当任何可观察组件发射时发射)。这两个与触摸相关的观察物必须发出它们的初始状态。我会尽快更新我的答案。@jp智囊团我更新了答案,请随意检查一下。太棒了,它正在工作!非常感谢你!“实际上,我还在学习Rx,谢谢你澄清这一点,@bartek lipinski.:)
// subscription to the touches happening on hidden view #1
Subscription subSecretLeft = RxView.touches(vSecretLeft)
        .filter(motionEvent -> motionEvent.getAction() == MotionEvent.ACTION_DOWN || motionEvent.getAction() == MotionEvent.ACTION_UP)
        .startsWith(MotionEvent.ACTION_UP)
        .subscribe(motionEvent -> secretLeftClicked = motionEvent.getAction() == MotionEvent.ACTION_DOWN);