ScrollView 嵌套EditText 滑动冲突解决

ScrollView 嵌套EditText,导致EditText 文字过多,滑动不了。

布局文件:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_gravity="center"
    android:layout_width="@dimen/guide_width"
    android:layout_height="wrap_content">
               <EditText
            android:id="@+id/et_body"
            android:layout_width="wrap_content"
            android:layout_height="128dp"
            android:layout_below="@+id/tv_title"
            android:layout_marginLeft="24dp"
            android:layout_marginTop="20dp"
            android:layout_marginRight="24dp"
            android:background="@null"
            android:lineSpacingExtra="3.6dp"
            android:editable="false"
            android:text="@string/zz_net_warn"
            android:textColor="@color/color_common_text_primary"
            android:textSize="@dimen/font_size_medium__" />


</ScrollView>

解决方法1:

给mEditText 设置一个OnTouchListener

mEditText.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
//                注释掉的是错误的示例 这个不能return myCanScroll  因为myCanScroll是true 的话, 这里就会消费掉时间,
//EditText 的onTouch  就不会执行了
//                boolean myCanScroll = view.canScrollVertically(1) || view.canScrollVertically(-1);
//                view.getParent().requestDisallowInterceptTouchEvent(myCanScroll);
//                return myCanScroll;

                boolean myCanScroll = view.canScrollVertically(1) || view.canScrollVertically(-1);
                //如果我们要处理 那么就告诉父亲不要拦截就行了
                view.getParent().requestDisallowInterceptTouchEvent(myCanScroll);
                // 一定要返回false
                return false;
            }
        });

canScrollVertically 方法 解析

    /**
     * Check if this view can be scrolled vertically in a certain direction.
     *
     * @param direction Negative to check scrolling up, positive to check scrolling down.
     * @return true if this view can be scrolled in the specified direction, false otherwise.
     */
    public boolean canScrollVertically(int direction) {
        final int offset = computeVerticalScrollOffset();
        final int range = computeVerticalScrollRange() - computeVerticalScrollExtent();
        if (range == 0) return false;
        if (direction < 0) {
            return offset > 0;
        } else {
            return offset < range - 1;
        }
    }

表示当前view 能不能竖直方向滑动,-1 表示能不能向上滑动,1 表示能不能向下滑动。注意,一些子类重写了这个方法里面调用的computeVerticalScrollOffset ,比如ScrollView.

当ScrollView 的高度是wrap_content 的时候,这个方法恒返回false.因为高度是wrap_content,导致ScrollView 的高度就是子View 的高度,其实控件是不能滑动的,所以这个也返回false。

解决方法二:

public class MyEditTextView extends EditText {
    public MyEditTextView(Context context) {
        super(context);
    }

    public MyEditTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public MyEditTextView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        boolean canScroll = canScrollVertically(1) || canScrollVertically(-1);
        getParent().requestDisallowInterceptTouchEvent(canScroll);
        return super.onTouchEvent(event);
    }
}

自己重写一下onTouchEvent。在布局里面使用这个控件。

方案三:

    <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="com.example.fragment.TouchConflictFragment">
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">
       
            <ScrollView
                android:layout_width="match_parent"
                android:layout_height="200dp"
                android:id="@+id/my_scroll"
                >
                <TextView
                    android:layout_width="match_parent"
                    android:layout_height="200dp"
                    android:text="@string/test"
                    android:editable="false"
                    android:id="@+id/edit_text3"
                    />

            </ScrollView>      
        </LinearLayout>
    </ScrollView>
myScroll.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                boolean b = v.canScrollVertically(1) || v.canScrollVertically(-1);
                v.getParent().requestDisallowInterceptTouchEvent(b);
                return false;
            }
        });
发布了485 篇原创文章 · 获赞 61 · 访问量 42万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览