ScrollView中使用EditText,并解决滑动冲突

Posted 夜尽天明89

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ScrollView中使用EditText,并解决滑动冲突相关的知识,希望对你有一定的参考价值。

描述:
在一个ScrollView中,有一个固定了高度的 EditText,EditText 可以输入很多文字,当文字过多时,需要滑动文字查看。此时,不能让 ScrollView 滑动。同理,当触摸到 EditText 以外的地方(ScrollView区域内)时,滑动界面的时候, EditText 内的文字,不能滑动。此外,如果EditText 中文字行数少,不用滑动,就可以看到全文的时候,在EditText中滑动,也是 界面进行滑动

解决思路:判断EditText 中文字的行数,是否超过了能显示的最大行数。如果超过了,就拦截事件,不让父控件消费事件。

onInterceptTouchEvent(拦截事件),只在 ViewGroup中,才会有

代码:
MyEditTextLinearLayout

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.EditText;
import android.widget.LinearLayout;
import androidx.annotation.Nullable;
import androidx.core.widget.NestedScrollView;

public class MyEditTextLinearLayout extends LinearLayout 

    private static final String TAG = "ScrollviewEdit";
    private NestedScrollView parentScrollview;
    private EditText editText;
    private int showLineMax = 0;


    public MyEditTextLinearLayout(Context context) 
        this(context,null);
    

    public MyEditTextLinearLayout(Context context, @Nullable AttributeSet attrs) 
        this(context, attrs,0);
    

    public MyEditTextLinearLayout(Context context, @Nullable AttributeSet attrs, int defStyleAttr) 
        super(context, attrs, defStyleAttr);
    


    public void setParentScrollview(NestedScrollView parentScrollview) 
        this.parentScrollview = parentScrollview;
    

    public void setEditeText(EditText editText) 
        this.editText = editText;
        LayoutParams lp = (LayoutParams) editText.getLayoutParams();
        showLineMax = lp.height / editText.getLineHeight();
    

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) 
        if (parentScrollview == null) 
            return super.onInterceptTouchEvent(ev);
         else 
            if (ev.getAction() == MotionEvent.ACTION_DOWN && editText.getLineCount() >= showLineMax) 
                // 将父scrollview的滚动事件拦截
                setParentScrollAble(false);
             else if (ev.getAction() == MotionEvent.ACTION_UP) 
                // 把滚动事件恢复给父Scrollview
                setParentScrollAble(true);
            
        
        return super.onInterceptTouchEvent(ev);
    

    /**
     * 是否把滚动事件交给父scrollview
     *
     * @param flag
     */
    private void setParentScrollAble(boolean flag) 
        parentScrollview.requestDisallowInterceptTouchEvent(!flag);
    



布局中使用

<ScrollView
	android:id="@+id/myScrollView"
	......>

	<LinearLayout
		......>

            <...MyEditTextLinearLayout
            	android:id="@+id/myLl"
				......>

                <EditText
                	android:id="@+id/myEt"
                	......
                	......
                />

            </...MyEditTextLinearLayout>

	</LinearLayout>

</ScrollView>

界面代码中使用

myLl.setParentScrollview(myScrollView);
myLl.setEditeText(myEt);

以上是关于ScrollView中使用EditText,并解决滑动冲突的主要内容,如果未能解决你的问题,请参考以下文章

ScrollView中存在EditText,焦点变化引发自动滚动问题

解决EditText不能撑满全屏的问题及EditText你应该知道的属性

ScrollView嵌套EditText联带滑动的解决办法

解决EditText和ScrollView滑动冲突问题

解决scrollView中嵌套编辑框导致不能上下滑动的问题

解决EditText跟ScrollView滑动冲突