先看效果图:
整体布局是一个scrollview,最下面的是嵌套一个listview,listview的滑动事件已经被禁止,listview的item的textview的高度是固定的,当textview里面的文字过多时就得让textview可滚动,先说一下textview的滚动方法,其实textview的滚动方法有很多,我感觉这种很优雅很方便,直接上代码:
<TextView android:id="@+id/approval_content" android:layout_width="match_parent" android:layout_height="@dimen/dp_80" android:scrollbars="vertical" android:layout_marginBottom="@dimen/dp_10" android:layout_marginLeft="@dimen/dp_60" android:layout_marginRight="@dimen/dp_25" android:background="@drawable/shape_edit_text_introduce" android:paddingLeft="@dimen/dp_2" android:paddingRight="@dimen/dp_2" android:textColor="@color/default_grey_color" android:textSize="@dimen/sp_12" />这是listview item的布局文件,设置textview的滚动条: scrollbars=“vertical”
设置textview可以滚动的方法
你的需要滚动的textview.setMovementMethod(ScrollingMovementMethod.getInstance());可是这个时候问题来了,当我触摸可以滚动的textview想滚动的时候,texview没有滚动,而是整个布局的scrollview开始滚动,那怎么办呢?直接上代码:
@Override public boolean onTouch(View v, MotionEvent event) { // TODO Auto-generated method stub if(event.getAction()==MotionEvent.ACTION_DOWN){ //通知父控件不要干扰 v.getParent().requestDisallowInterceptTouchEvent(true); } if(event.getAction()==MotionEvent.ACTION_MOVE){ //通知父控件不要干扰 v.getParent().requestDisallowInterceptTouchEvent(true); } if(event.getAction()==MotionEvent.ACTION_UP){ v.getParent().requestDisallowInterceptTouchEvent(false); } return false; } });
在手指触摸可以滚动的textview的触摸监听事件里面做一下拦截就OK了。
当文字的总高度小于控件的高度的时候,当触摸文字区域是整个scrollView在滚动,所以需要在onTou事件加个判断,直接上代码:
protected boolean canVerticalScroll(TextView editText) { //滚动的距离 int scrollY = editText.getScrollY(); //控件内容的总高度 int scrollRange = editText.getLayout().getHeight(); //控件实际显示的高度 int scrollExtent = editText.getHeight() - editText.getCompoundPaddingTop() - editText.getCompoundPaddingBottom(); //控件内容总高度与实际显示高度的差值 int scrollDifference = scrollRange - scrollExtent; if (scrollDifference == 0) { return false; } return (scrollY > 0) || (scrollY < scrollDifference - 1); }