안드로이드 데이터 바인딩 : 없음 반환 문을 생성 된 코드에 두 번 이상 어댑터 바인딩 정의를 호출 할 때

AaronJ :

나는 안드로이드 데이터 바인딩 라이브러리와 MVVM 아키텍처를 사용하고 있습니다. XML에서 내가 형 myViewModel의 뷰 모델이라는 변수를 정의 레이아웃. 레이아웃은 나는 다음과 같은 사용자 정의 바인딩 어댑터를 사용하는 몇 가지 TextInputEditText있다 :

//makes the drawable_right of the TextView clickable
@SuppressLint("ClickableViewAccessibility")
@BindingAdapter("onDrawableRightClick")
inline fun TextView.setOnDrawableRightClick(crossinline f: () -> Unit) {
    this.setOnTouchListener(View.OnTouchListener { _, event ->
        if (event.action == MotionEvent.ACTION_UP) {
            if (event.rawX >= this.right - this.paddingRight - this.compoundDrawables[DRAWABLE_RIGHT].bounds.width()) {
                f()
                return@OnTouchListener true
            }
        }
        false
    })
}

레이아웃에서 나는 추가 app:onDrawableRightClick="@{() -> viewModel.doThing()}"TextInputEditText의 한으로 실행을 클릭합니다. 모든 것이 아무 문제가 작동하지 않습니다.

이제 돌아가서 추가 app:onDrawableRightClick="@{() -> viewModel.doOtherThing()}"두 번째 TextInputEditText에. 이 시간 컴파일이 실패합니다 error: missing return statement.

이 오류는 코드 블록에 MyFragmentBindingImpl (생성)이다 :

public final kotlin.Unit _internalCallbackInvoke(int sourceId ) {
    switch(sourceId) {
        case 1: {
            // localize variables for thread safety
            // viewModel
            com.example.MyViewModel viewModel = mViewModel;
            // viewModel != null
            boolean viewModelJavaLangObjectNull = false;

            viewModelJavaLangObjectNull = (viewModel) != (null);
            if (viewModelJavaLangObjectNull) {

                   viewModel.doOtherThing();
            }
            return null;
        }
        case 2: {
            // localize variables for thread safety
            // viewModel
            com.example.MyViewModel viewModel = mViewModel;
            // viewModel != null
            boolean viewModelJavaLangObjectNull = false;

            viewModelJavaLangObjectNull = (viewModel) != (null);
            if (viewModelJavaLangObjectNull) {

                viewModel.doThing();
            }
            return null;
        }  
    }
}

기본 케이스 나 스위치의 반환 문 밖에서도 있습니다. 이 오류를 발생하지만 난 확신 내가 XML로 돌아가서 리스너 바인딩 중 하나를 제거 할 때 모든 경우는, 어쨌든 ... 처리 될 때 기본 케이스가 필요하지 않다고했다 MyFragmentBindingImpl이로 변경 :

public final kotlin.Unit _internalCallbackInvoke(int sourceId ) {
    // localize variables for thread safety
    // viewModel
    com.example.MyViewModel viewModel = mViewModel;
    // viewModel != null
    boolean viewModelJavaLangObjectNull = false;

    viewModelJavaLangObjectNull = (viewModel) != (null);
    if (viewModelJavaLangObjectNull) {

      viewModel.doThing();
    }
    return null;
}

컴파일러는 다시 행복,하지만 난 두 번 이상 바인딩 어댑터를 사용해야합니다. 어떻게 라이브러리가 return 문을 추가 할 수 있습니까? 해결 방법이 있습니까?

나는 안드로이드 스튜디오 3.4 미리보기를 사용하고 있습니다. 감사합니다 모든

아브라함 매튜 :
@SuppressLint("ClickableViewAccessibility")
@BindingAdapter("onDrawableEndClick")
fun setOnDrawableEndClick(view: TextView, listener: OnCompoundDrawableClickListener?) {
    val padding = 10
    if (listener != null) {
        view.setOnTouchListener { _, event ->
            if (event.action == MotionEvent.ACTION_DOWN) {
                if (view.compoundDrawables[DRAWABLE_RIGHT] == null) return@setOnTouchListener false
                else if (event.rawX >= (view.right - view.compoundDrawables[DRAWABLE_RIGHT].bounds.width() - padding)) {
                    listener.onDrawableEnd()
                    return@setOnTouchListener true
                }
            }
            return@setOnTouchListener false
        }
    }
}

내가 청취자에 대한 사용자 지정 인터페이스를 사용하고이 같은 시도 (OnCompoundDrawableClickListener)

추천

출처http://43.154.161.224:23101/article/api/json?id=168048&siteId=1