说一说EditText(三)

当我们在ScrollView中放EditText,会出现EditText与ScrollView的滑动冲突。

注:当我们指定了EditText的高度时,一般当我们输入的内容足够多时,或者不断换行,会出现内容的高度超出EditText的高度,此时,就需要滑动EditText了。

那么,如何解决呢?

先附上示例(直接上代码):

            <au.com.joincc.secusoft.view.ScrollViewInsideLinearLayout
                android:id="@+id/scrollViewInsideLinearLayout"
                android:layout_width="match_parent"
                android:layout_height="100dp"
                android:layout_marginLeft="20dp"
                android:layout_marginRight="20dp"
                android:layout_marginTop="5dp">

                <EditText
                    android:id="@+id/et_info"
                    android:layout_width="match_parent"
                    android:layout_height="100dp"
                    android:background="@color/selectedColor3"
                    android:textColor="#333333"
                    android:textSize="14dp"
                    android:gravity="start"
                    android:cursorVisible="false"/>
            </au.com.joincc.secusoft.view.ScrollViewInsideLinearLayout>

ScrollViewInsideLinearLayout的代码如下:

public class ScrollViewInsideLinearLayout extends LinearLayout {
    private ScrollView parentScrollView;
    private EditText editText;
    private int showLineMax = 0;

    public void setParentScrollView(ScrollView parentScrollView) {
        this.parentScrollView = parentScrollView;
    }

    public void setEditText(EditText editText) {
        this.editText = editText;
        ScrollViewInsideLinearLayout.LayoutParams lp = (LayoutParams) editText.getLayoutParams();
        showLineMax = lp.height / editText.getLineHeight();
    }

    public ScrollViewInsideLinearLayout(Context context) {
        super(context);
    }

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

    @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);
    }
}

现在,我们再来结合代码进行分析。

首先,明确我们的目标:解决掉这个冲突,实现以下:

1、当EditText中的内容的高度超出EditText的高度时,我们在EditText的区域上滑动,可以滑动EditText的内容。

2、当EditText中的内容的高度不超出EditText的高度时,我们在EditText的区域上滑动,仍然滑动ScrollView。

怎么做呢?

其实我们给EditText包上一层LinearLayout就可以了。这个LinearLayout由我们自定义,详细代码上面已经给了。

具体使用起来,就很简单了。

scrollViewInsideLinearLayout.setParentScrollView(scrollView);
scrollViewInsideLinearLayout.setEditText(et_info);

猜你喜欢

转载自blog.csdn.net/zdj_Develop/article/details/81231872