【Android】解決ScrollView中嵌套EditText時的滑動滾動衝突

僅供個人參考使用,如果你喜歡,你也可以用。保護網絡環境,拒絕噴子。我是無私奉獻的,沒讓噴子拿一分錢,噴子請閉嘴。

0、二話不說,上工具類代碼

 

import android.view.MotionEvent;
import android.view.View;
import android.widget.EditText;

/**
 * 用於解決EditText和ScrollView的觸摸滾動衝突
 * Created by LiuChaoya on 2018/1/25 09:46.
 * email  [email protected]
 */

public class SolveEditTextScrollClash implements View.OnTouchListener {

    private EditText editText;

    public SolveEditTextScrollClash(EditText editText) {
        this.editText = editText;
    }

    @Override
    public boolean onTouch(View view, MotionEvent event) {
        //觸摸的是EditText而且當前EditText能夠滾動則將事件交給EditText處理。否則將事件交由其父類處理
        if ((view.getId() == editText.getId() && canVerticalScroll(editText))) {
            view.getParent().requestDisallowInterceptTouchEvent(true);
            if (event.getAction() == MotionEvent.ACTION_UP) {
                view.getParent().requestDisallowInterceptTouchEvent(false);
            }
        }
        return false;
    }

    /**
     * EditText豎直方向能否夠滾動
     * @param editText  須要推斷的EditText
     * @return  true:能夠滾動   false:不能夠滾動
     */
    private 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);
    }
}

1、在需要處理衝突的類中直接調用,舉個栗子

 

 

EditText editText = (EditText)findViewById(R.id.editText);
editText.setOnTouchListener(new SolveEditTextScrollClash(editText));

2、結束(代碼很少,不提供下載鏈接,請需要的自行copy)。

 

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