欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

说一说EditText(三)

程序员文章站 2022-04-21 17:50:16
...

当我们在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);

 

 

相关标签: EditText