说一说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(二)
下一篇: 崩溃bug日志总结2