NestedScrollView嵌套EditText,導致EditText滑動衝突

NestedScrollView嵌套EditText,EditText文本很多時,無法上下滑動:

方法一:

   edittext.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                if(motionEvent.getAction()==MotionEvent.ACTION_DOWN){
                    //通知父控件不要干擾
                    view.getParent().requestDisallowInterceptTouchEvent(true);
                }
                if(motionEvent.getAction()==MotionEvent.ACTION_MOVE){
                    //通知父控件不要干擾
                    view.getParent().requestDisallowInterceptTouchEvent(true);
                }
                if(motionEvent.getAction()==MotionEvent.ACTION_UP){
                    view.getParent().requestDisallowInterceptTouchEvent(false);
                }
                return false;
            }
        });

缺點:只能觸摸EditText外部來滑動;

方法二:

// NestedScrollView嵌套EditText,導致EditText滑動衝突
mBinding.etCheckDesc.setOnTouchListener((view, motionEvent) -> {
    if (view.getId() == R.id.et_check_desc && UiUtil.canVerticalScroll(mBinding.etCheckDesc)) {
        //通知父控件不要干擾
        view.getParent().requestDisallowInterceptTouchEvent(true);
    }
    if (motionEvent.getAction() == MotionEvent.ACTION_UP) {
        view.getParent().requestDisallowInterceptTouchEvent(false);
    }
    return false;
});
 /**
     * EditText豎直方向是否可以滾動
     * <p>
     * https://www.jb51.net/article/86932.htm
     *
     * @param editText 需要判斷的EditText
     * @return true:可以滾動  false:不可以滾動
     */
    public static boolean canVerticalScroll(EditText editText) {
        //滾動的距離
        int scrollY = editText.getScrollY();
        //控件內容的總高度
        int scrollRange = editText.getLayout().getHeight();
        //控件實際顯示的高度
        int scrollExtent = editText.getHeight() - editText.getCompoundPaddingTop() - editText.getCompoundPaddingBottom();
        //控件內容總高度與實際顯示高度的差值
        int scrollDifference = scrollRange - scrollExtent;

        if (scrollDifference == 0) {
            return false;
        }

        return (scrollY > 0) || (scrollY < scrollDifference - 1);
    }

方法三:自定義EditText控件:
參考:https://www.jianshu.com/p/b352fdee325d

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章