完美解决EditText和ScrollView的滚动冲突(上)
在网上搜了一下EditText和ScrollView的滚动冲突,发现差点儿全部的解决方式都是触摸EditText的时候就将事件交由EditText处理,否则才将事件交由ScrollView处理。这样确实初步攻克了两者之间的滚动冲突,但并非最好的解决方式。比方,EditText本来能够显示6行文本,可是眼下仅仅显示了5行文本,此时我们在EditText区域进行滑动并期望整个页面能够滚动,但因为我们将事件交给了EditText进行处理,所以页面并不能滚动,这种体验是极差的。事实上我们更希望当EditText出现滚动栏的时才将滚动事件交由它本身处理,其它情况下应当让ScrollView来处理。那么该怎样进行实现呢?接下来咱们就做一个小Demo来实现这种方案。
1.布局文件
首先编写布局文件,能够看出这是很easy的一个布局:一个ScrollView包裹着一个垂直方向的LinearLayout。LinearLayout中有两个TextView和一个EditText,当中为了区分EditText的范围,给其设置了一个背景rectangle_shape。
<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">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="300dp"
android:text="Hello World Begin!"/>
<EditText
android:id="@+id/edit_text"
android:hint="EditText"
android:layout_width="match_parent"
android:layout_height="200dp"
android:gravity="top"
android:background="@drawable/rectangle_shape"/>
<TextView
android:layout_width="match_parent"
android:layout_height="300dp"
android:text="Hello World End!"/>
</LinearLayout>
</ScrollView>
2.rectangle_shape
背景rectangle_shape的代码,更没有什么技术含量。。。。。。
<?
xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#ffffff"/>
<stroke android:color="#cccccc"
android:width="1dp"/>
</shape>
3.MainActivity中的代码
这里就是基本的代码逻辑了。先给EditText设置OnTouchListener,然后先在OnTouch方法中推断当前点击的区域是否为EditText。假设为EditText区域则再推断能否够在垂直方向上进行滚动,假设能够滚动则将事件交由EditText处理,否则将事件交由ScrollView处理。
此处最重要的就是怎样推断EditText区域在垂直方向上能够滚动,此处的代码已经封装成了一个方法。大家能够直接使用。那么为什么要这样推断呢?假设大家仍有兴趣。请继续阅读完美解决EditText和ScrollView的滚动冲突(下)。
public class MainActivity extends Activity implements View.OnTouchListener {
private EditText mEditText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mEditText = (EditText) findViewById(R.id.edit_text);
mEditText.setOnTouchListener(this);
}
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
//触摸的是EditText而且当前EditText能够滚动则将事件交给EditText处理。否则将事件交由其父类处理
if ((view.getId() == R.id.edit_text && canVerticalScroll(mEditText))) {
view.getParent().requestDisallowInterceptTouchEvent(true);
if (motionEvent.getAction() == MotionEvent.ACTION_UP) {
view.getParent().requestDisallowInterceptTouchEvent(false);
}
}
return false;
}
/**
* EditText竖直方向能否够滚动
* @param editText 须要推断的EditText
* @return true:能够滚动 false:不能够滚动
*/
private boolean canVerticalScroll(EditText 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);
}
}
完美解决EditText和ScrollView的滚动冲突(上)的更多相关文章
- 完美解决HALCON C#编程目标平台冲突问题
完美解决HALCON C#编程目标平台冲突问题 楼主# 更多发布于:2016-11-23 10:06 背景: 目标机器工控机使用11.0.1 32位Halcon 原因你懂的.开发环境Win ...
- Android 解决Gallery下ScrollView滑动事件冲突
在Gallery下,里面内容过长超出屏幕,这时我们可以用ScrollView来滚动,但是这样做了以后,会发现一个问题,Gallery的滑动事件和ScrollView的滑动事件起冲突,这时我们可以自定义 ...
- 解决EditText和ScrollView滑动冲突问题
该类需要调用 OnTouchListener接口 黄色部分是需要更改部分,改为自己的edittext@Override public boolean onTouch(View view, Motion ...
- 解决EditText跟ScrollView滑动冲突
etContent.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, Motion ...
- 完美解决ListView 与 ScrollView 共存问题
1:首先设置ListView的高度,在setAdapter之后调用此方法. public static void setListViewHeightBasedOnChildren(ListView l ...
- 【转】完美解决Python与anaconda之间的冲突问题
本文转自:https://blog.csdn.net/sinat_41898105/article/details/80660332 anaconda指的是一个开源的Python发行版本,其包含了co ...
- 完美解决Python与anaconda之间的冲突问题
anaconda指的是一个开源的Python发行版本,其包含了conda.Python等180多个科学包及其依赖项.因为包含了大量的科学包,Anaconda 的下载文件比较大(约 515 MB),如果 ...
- 解决distinct与order by 的冲突
sql="select distinct id from test order by otherfield desc" 需要找到不同的id,同时又想让记录按fbsj排序.但是这样一 ...
- 使用LinearLayout实现ListView,解决ListView和ScrollView滚动冲突
在项目中,我们常常会遇到一个ScrollView里面会嵌套ListView的情况,但往往你会发现,ListView和ScrollView的滚动时间会有冲突问题,造成ListView不能完全显示.虽然网 ...
随机推荐
- struts2之actionSupport学习
actionSupport在手工完成字段验证,显示错误消息,国际化等情况下推荐使用.
- sqlserver如何查询一个表的主键都是哪些表的外键
select object_name(a.parent_object_id) 'tables' from sys.foreign_keys a where a.referenced_object_ ...
- vue学习图解
vue2.0版本的学习图解个人心得!本文为原创禁止转载!!转载需要注明出处,谢谢合作!!!
- JavaScriptav数据类型和变量
数据类型 计算机顾名思义就是可以做数学计算的机器,因此,计算机程序理所当然地可以处理各种数值.但是,计算机能处理的远不止数值,还可以处理文本.图形.音频.视频.网页等各种各样的数据,不同的数据,需要定 ...
- 执行join_paired_ends.py报错Cannot find fastq-join
通过 conda 安装 qiime 1后,在执行join_paired_ends.py时报错: burrito.util.ApplicationNotFoundError: Cannot find f ...
- 使用SELECT语句检索数据
使用SELECT语句检索数据select指令适用于SQL数据库SELECT 语句用于从数据库中选取数据.(指令不分大小写,选择的值除名字和一些有特殊意义的字符可不分大小写,from结束时一定要加;) ...
- 这段代码很Pythonic | 相见恨晚的 itertools 库
前言 最近事情不是很多,想写一些技术文章分享给大家,同时也对自己一段时间来碎片化接受的知识进行一下梳理,所谓写清楚才能说清楚,说清楚才能想清楚,就是这个道理了. 很多人都致力于把Python代码写得更 ...
- 【反向并查集、联通图】P1197 [JSOI2008]星球大战
题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治着整个星系. 某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通过特殊的以太隧 ...
- 利用stylist插件,简单两步屏蔽新浪微博上的广告
以前新浪微博只是在侧栏有几块小小的广告,还算可以接受,想着忍忍就算了,可最近真是越来越不厚道了,自从和淘宝合作之后,侧栏就开始有一大块广告根据你在淘宝的搜索记录推荐商品,更可恶的是信息流里的祛痘微博现 ...
- 洛谷 3959 宝藏 NOIP2017提高组Day2 T2
[题解] 状压DP. f[i]表示现在的点是否连接的状态是i. #include<cstdio> #include<cstring> #include<algorithm ...