2017-06-10 16 views
0

RxBindingを使用してEditTextの右側のドロアブルにクリックリスナーを実装する方法はありますか?rxbindingとright drawableをクリック

私が見つけた唯一のものがある:

 RxTextView.editorActionEvents(mEditText).subscribeWith(new DisposableObserver<TextViewEditorActionEvent>() { 
     @Override 
     public void onNext(TextViewEditorActionEvent textViewEditorActionEvent) { 
      int actionId = textViewEditorActionEvent.actionId(); 
      if(actionId == MotionEvent.ACTION_UP) { 
      } 

     } 

     @Override 
     public void onError(Throwable e) { 

     } 

     @Override 
     public void onComplete() { 

     } 
    }); 

しかし、このイベントに、私はクリックの位置についての情報を見つけることができません。

これは私がRxJava使用して、それをやった方法です:

public Observable<Integer> getCompoundDrawableOnClick(EditText editText, int... drawables) { 
    return Observable.create(e -> { 
     editText.setOnTouchListener((v, event) -> { 
      if (event.getAction() == MotionEvent.ACTION_UP) { 
       for (int i : drawables) { 
        if (i == UiUtil.COMPOUND_DRAWABLE.DRAWABLE_RIGHT) { 
         if (event.getRawX() >= (editText.getRight() - editText.getCompoundDrawables()[i].getBounds().width())) { 
          e.onNext(i); 
          return true; 
         } 
        } 
       } 
      } 
      // add the other cases here 
      return false; 

     }); 
    }); 

は、しかし、あなたは確認する必要がある場合、私は、私はあなたが間違った場所に検索しているホイール

答えて

1

を再発明しています感じますタッチイベントの場合は、を使用してViewのタッチイベントを使用し、論理を適用し、タッチしていないものをすべてフィルタリングして、目的の場所(複合ドロアブル)に「クリック」するようにします。
私はループロジックのために、あなたが直接UiUtil.COMPOUND_DRAWABLE.DRAWABLE_RIGHTを使用することができますが、とにかくこの例では、あなたのロジックを追っを理解わからない認めなければならない:

public Observable<Object> getCompoundDrawableOnClick(EditText editText, int... drawables) { 
     return RxView.touches(editText) 
       .filter(motionEvent -> { 
        if (motionEvent.getAction() == MotionEvent.ACTION_UP) { 
         for (int i : drawables) { 
          if (i == UiUtil.COMPOUND_DRAWABLE.DRAWABLE_RIGHT) { 
           if (motionEvent.getRawX() >= (editText.getRight() - editText.getCompoundDrawables()[i].getBounds().width())) { 
            return true; 
           } 
          } 
         } 
        } 
        return false; 
       }) 
       .map(motionEvent -> { 
        // you can omit it if you don't need any special object or map it to 
        // whatever you need, probably you just want click handler so any kind of notification Object will do. 
       }); 
    }