当前位置: 首页 > 编程笔记 >

完美解决EditText和ScrollView的滚动冲突(下)

严开宇
2023-03-14
本文向大家介绍完美解决EditText和ScrollView的滚动冲突(下),包括了完美解决EditText和ScrollView的滚动冲突(下)的使用技巧和注意事项,需要的朋友参考一下

上篇文章完美解决EditText和ScrollView的滚动冲突(上)中提到咱们自己写了一个判断EditText是否可以在垂直方向上滚动的方法,那么这个方法是如何得来的呢?
其实Android API里是有一个判断控件是否可以在垂直方向上滚动的方法的,方法名字叫做canScrollVertically(int direction),代码如下:

/**
   * Check if this view can be scrolled vertically in a certain direction.
   *
   * @param direction Negative to check scrolling up, positive to check scrolling down.
   * @return true if this view can be scrolled in the specified direction, false otherwise.
   */
  public boolean canScrollVertically(int direction) {
    final int offset = computeVerticalScrollOffset();
    final int range = computeVerticalScrollRange() - computeVerticalScrollExtent();
    if (range == 0) return false;
    if (direction < 0) {
      return offset > 0;
    } else {
      return offset < range - 1;
    }
  }

根据注释不难得知此方法是用来判断当前控件是否可以在垂直的方向上进行滚动的:当参数direction传的是负值的时候,会判断当前控件是否可以向上滚动;否则当参数direction传的是非负值的时候,会判断当前控件是否可以向下滚动。
由此得知我们完全可以利用此方法这样来判断一个控件是否可以在垂直方向上进行滚动:

if(editText.canScrollVertically(-1) || editText.canScrollVertically(0)) {
      //垂直方向上可以滚动
    }

那么为什么不使用此方法呢?很无奈,因为这个方法是在API 14(也就是Android4.0)才提供的方法,而很多时候我们需要兼容4.0以下的手机,所以并不能直接使用。虽然不能直接使用此方法,不过我们可以看一下它内部是怎么实现的,直接抄过来不就得了!不过还有个悲剧的消息,computeVerticalScrollOffset()、computeVerticalScrollRange()和computeVerticalScrollExtent()这三个方法都是protected方法,所以我们仍然不能使用,没办法,我们只好一块儿将这三个方法内部的实现都看一下。

1.computeVerticalScrollOffset()方法

首先是computeVerticalScrollOffset()方法:`

protected int computeVerticalScrollOffset() {
    return mScrollY;
  }

此方法定义在View中,并且EditText和TextView都没有重写,所以其返回的必然是mScrollY。那么不适用这个方法我们该如何得到mScrollY呢?稍微猜测一下,既然有mScrollY这么一个变量,那么就应该有其的get方法。查看API,不难发现View中确实有个getScrollY()方法:

public final int getScrollY() {
    return mScrollY;
  }

2. computeVerticalScrollRange()方法

OK,第一个方法的值我们通过getScrollY()拿到了,接下来咱们来看第二个方法computeVerticalScrollRange():

protected int computeVerticalScrollRange() {
    return getHeight();
  }

在View中很快找到了此方法,但此方法使我们需要的吗?不要忘了我们使用的是EditText!所以我们需要查看一下在EditText和TextView中是否对此方法进行了重载。不出我们所料,这个方法还真在TextView中进行了重载:

@Override
  protected int computeVerticalScrollRange() {
    if (mLayout != null)
      return mLayout.getHeight();

    return super.computeVerticalScrollRange();
  }

这个方法返回的是mLayout的高度,那么我们怎么获得mLayout呢?刚刚咱们获得mScrollY时使用了getScrollY()方法,那么是不是会有一个getLayout()方法呢?抱着试试看的态度,忽然间发现在TextView中还真有这么一个方法:

public final Layout getLayout() {
    return mLayout;
  }

3.computeVerticalScrollExtent()方法

恩,第二个方法的值我们也通过getLayout().getHeight()方法拿到了,现在咱们就来看一下最后一个方法computeVerticalScrollExtent():

protected int computeVerticalScrollExtent() {
    return getHeight();
  }

在View中我们同样找到了此方法,但根据第二个方法的经验,我们还应该去EditText和TextView中看一下有没有重载。又一次地不出我们所料,这个方法果然在TextView中进行了重载:

@Override
  protected int computeVerticalScrollExtent() {
    return getHeight() - getCompoundPaddingTop() - getCompoundPaddingBottom();
  }

然后不难发现,此处使用的三个方法getHeight()、getCompoundPaddingTop()和getCompoundPaddingBottom()都是public方法,我们直接调用即可。
至此,我们已经可以完全对canScrollVertically(int direction)这个方法进行重写了,而重写之后的方法就是咱们上一篇文章中使用的canVerticalScroll(EditText editText)方法。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。

 类似资料:
  • 本文向大家介绍完美解决EditText和ScrollView的滚动冲突(上),包括了完美解决EditText和ScrollView的滚动冲突(上)的使用技巧和注意事项,需要的朋友参考一下 在网上搜了一下EditText和ScrollView的滚动冲突,发现几乎所有的解决方案都是触摸EditText的时候就将事件交由EditText处理,否则才将事件交由ScrollView处理。这样确实初步解决了两

  • 本文向大家介绍完美解决android 项目jar包冲突的问题,包括了完美解决android 项目jar包冲突的问题的使用技巧和注意事项,需要的朋友参考一下 大家在做开发中竟然需要用到一些三方库 或者 需要集成三方的SDK开发包,尤其是项目特别庞大的时候,引用的三方的东西特别多,那么肯定会碰到一些jar包冲突的情况。 常见的情况有以下几种 1.项目自己引用jar包重复 2.项目中jar包和三方SDK

  • Windows 用tutorial进行的操作 若要进行pull操作,请右击tutorial目录,并选择‘拉取’。 用tutorial进行的操作 在以下画面点击‘确定’。 用tutorial进行的操作 我们看到画面上的警告信息表示自动合并失败。请点击‘关闭’以退出窗口。 用tutorial进行的操作 若您确认变更,请点击‘Yes’。 用tutorial进行的操作 TortoiseGit告诉我们:因"

  • 在上一个页面我们提及到,执行合并即可自动合并Git修改的部分。但是,也存在无法自动合并的情况。 如果远程数据库和本地数据库的同一个地方都发生了修改的情况下,因为无法自动判断要选用哪一个修改,所以就会发生冲突。 Git会在发生冲突的地方修改文件的内容,如下图。所以我们需要手动修正冲突。 ==分割线上方是本地数据库的内容, 下方是远程数据库的编辑内容。 如下图所示,修正所有冲突的地方之后,执行提交。

  • 解决冲突 CVS使用内联“冲突标志”来标记冲突,并且在更新时打印C。历史上讲,这导致了许多问题,因为CVS做得还不够。许多用户在它们快速闪过终端时忘记(或没有看到)C,即使出现了冲突标记,他们也经常忘记,然后提交了带有冲突标记的文件。 Subversion通过让冲突更明显来解决这个问题,它记住一个文件是处于冲突状态,在你运行svn resolved之前不会允许你提交修改,详情见“解决冲突(合并别人

  • 本文向大家介绍快速解决jquery.touchSwipe左右滑动和垂直滚动条冲突,包括了快速解决jquery.touchSwipe左右滑动和垂直滚动条冲突的使用技巧和注意事项,需要的朋友参考一下 本文为大家分享了jquery.touchSwipe左右滑动和垂直滚动条冲突问题的解决方法,具体内容如下 正好需要Html5做一个左右可以切换的功能,但是要保留上下滚动条功能。我在移动端使用的jquery.