添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
首页
学习
活动
专区
工具
TVP
最新优惠活动
发布
精选内容/技术社群/优惠产品, 尽在小程序
立即前往

Android textview奇怪的行为:自动滚动到焦点改变的顶部

基础概念

TextView 是 Android 中用于显示文本的 UI 组件。它支持多种文本格式和样式,并且可以响应用户的交互事件,如点击和焦点变化。

相关优势

  • 灵活性 TextView 可以显示简单的纯文本或复杂的富文本。
  • 可定制性 :可以通过属性设置文本的颜色、大小、样式等。
  • 交互性 :可以设置点击事件和焦点变化事件。

类型

  • 静态文本 :用于显示不可编辑的文本。
  • 动态文本 :根据应用逻辑动态更新文本内容。

应用场景

  • 显示用户界面中的说明性文本。
  • 显示从服务器获取的数据。
  • 显示用户输入的反馈信息。

问题描述

TextView 的焦点发生变化时,可能会出现自动滚动到顶部的奇怪行为。

原因

这种行为通常是由于 TextView MovementMethod 设置不当或者焦点变化时的布局重绘导致的。

解决方法

1. 检查 MovementMethod

确保 TextView 没有设置不必要的 MovementMethod ,例如 LinkMovementMethod ScrollingMovementMethod

代码语言: txt
复制
TextView textView = findViewById(R.id.textView);
textView.setMovementMethod(null); // 如果不需要滚动或链接点击,可以设置为null

2. 处理焦点变化

TextView 的焦点变化监听器中,可以手动控制滚动位置。

代码语言: txt
复制
textView.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (hasFocus) {
            textView.scrollTo(0, textView.getScrollY()); // 保持当前滚动位置
});

3. 使用 setDescendantFocusability

设置 TextView descendantFocusability 属性,防止子视图获取焦点。

代码语言: txt
复制
<TextView
    android:id="@+id/textView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:descendantFocusability="beforeDescendants"
    android:focusable="true"
    android:focusableInTouchMode="true" />

示例代码

代码语言: txt
复制
TextView textView = findViewById(R.id.textView);
textView.setMovementMethod(null); // 如果不需要滚动或链接点击,可以设置为null
textView.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (hasFocus) {
            textView.scrollTo(0, textView.getScrollY()); // 保持当前滚动位置
});

参考链接

通过以上方法,可以有效解决 TextView 在焦点变化时自动滚动到顶部的问题。

相关· 内容

Android 中文API——ScrollView

TextView 类也有自己 滚动功能,所以不需要使用ScrollView,但是只有两个结合使用,才能保证显示较多内容时候 效率。但只有两者结合使用才可以实现在一个较大 容器中一个文本视图效果。...此方法将视图滚 动到 顶部 或者底部,并且将 焦点 置于新 可视区域 顶部 /最底部组件。若没有适合 组件做 焦点 ,当前 ScrollView会收回 焦点 。...返回值 是否取得了 焦点 protected void onSizeChanged (int w, int h, int oldw, int oldh) 布局期间当视图 大小发生 改变 时调用。...参数 w     视图当前宽度 h     视图当前高度 oldw       视图 改变 宽度 oldh       视图 改变 高度 Android ApiDemos.../ScrollView2 添加 自动 滚动和智能 焦点 切换 [ Android 学习指南]使用ScrollView实现滚动效果 Android 中ScrollView与ListView共用问题 解决方案   示例代码

4.6K 3 0

Android 下拉刷新完全解析,教你如何一分钟实现下拉刷新功能

然后对ListView touch事件进行监听,如果当前ListView已经滚 动到 顶部 并且手指还在向下拉的话,那就将下拉头显示出来,松手后进行刷新操作,并将下拉头隐藏。原理示意图如下: ?...ableToPull) { yDown = event.getRawY(); // 如果首个元素 上边缘,距离父布局值为0,就说明ListView滚 动到 了最 顶部 ,此时应该允许下拉刷新...在onTouch方法中 第一行就调用了setIsAbleToPull方法来判断ListView是否滚 动到 了最 顶部 ,只有滚 动到 了最 顶部 才会执行后面的代码,否则就视为正常 ListView滚动,不做任何处理...当ListView滚 动到 了最 顶部 时,如果手指还在向下拖动,就会 改变 下拉头 偏移值,让下拉头显示出来,下拉 距离设定为手指移动距离 1/2,这样才会有拉力 感觉。...另外每次在下拉 时候都还会调用updateHeaderView方法来 改变 下拉头中 数据,比如箭头方向 旋转,下拉文字描述 改变 等。

5.4K 11 0
  • android 有阻尼下拉刷新列表 实现方法

    根据以上分析,我们可以知道,重画子View 原理就是: 当PullToRefreshListView已经滚 动到 顶部 时候,通过监控滑动手势来计算distanceY,从而确定要将canvas向上移动多少再重画子...如果此时PullToRefreshListView没有“滚 动到 顶部 ”,则不做任何处理,反之则将lastAction更新为ACTION_MOVE状态,更新isPulling变量,记录当前手指 位置作为计算下拉距离 起始位置...在这个手势处理 实现中,当用户在下拉过程中突然将PullToRefreshListView往上拉,如果将PullToRefreshListView 拉到不处于“滚 动到 顶部 状态”时,则重置下拉状态,使得...下拉到“滚 动到 顶部 ”状态,则又重新执行上述操作,使PullToRefreshListView进入下拉状态。...如何判断ListView是否已经滚 动到 顶部 下一步,我们如何判断ListView是否处于“滚 动到 顶部 ”状态呢?这一问题我PullToRefreshListView onScroll中解决。

    3.5K 1 0

    Android 中控制和禁止ScrollView 自动 动到 底部 方法

    一、 Android 控制ScrollView滚 动到 底部 在开发中,我们经常需要更新列表,并将列表拉倒最底部,比如发表微博,聊天界面等等, 这里有两种办法,第一种,使用scrollTo(): public...scrollView.fullScroll(ScrollView.FOCUS_UP);滚 动到 顶部 需要注意 是:该方法不能直接被调用 因为 Android 很多函数都是基于消息队列来同步,所以需要一部操作...为何如此 childView 有获取 焦点 能力 由于该 childView 超过屏幕大小,并且有获取 焦点 能力,所以造成了该问题。由于不能 改变 其大小,只能阻止其获取 焦点 。...基本思路有,取消它获取 焦点 能力,让ScrovView截获它 焦点 等。...如何解决 让 childView 焦点 被截获 ScrollView 下 LinearLayout 中加了 android :descendantFocusability="blocksDescendants

    3.6K 2 0

    Android 开发笔记(一百三十五)应用栏布局AppBarLayout

    那么 Android 5.0也同时给出了相应 解决方案,即推出MaterialDesign库,通过该库中 AppBarLayout控件,对Toolbar加以包装,从而实现 顶部 工具栏 动态变化效果。...AppBarLayout 滚动 行为 呢?...,比如说是先 还是后 ,是 一半还是全部 ,是 自动 还是手动 等等。...既然AppBarLayout 高度是变化 ,那也得区分是 一半还是 全部。...3、大家都知道ViewPager是左右滚动 翻页视图,用户通过手势把页面横向拉动一段距离后松开,系统会判断接下来是 自动 还是 自动 ,总之最后用户看到 是一个完整 页面,而不是拉到一半 页面。

    2K 4 0

    Android 带你解析ScrollView--仿QQ空间标题栏渐变

    ScrollView滑动监听: Google并没有给我们提供ScrollView 滑动距离、是否滑 动到 布局底部、 顶部 方法,但是提供了一个onScrollChanged方法: @Override...scrollViewListener.onScrollChanged(this, x, y, oldx, oldy); 设置标题渐变 滚动监听暴露出来我们就该去设置标题栏随着ScrollView 滑动来 改变 标题栏 透明度实现渐变...image.png 然后我们需要获取图片 高度,并且设置滚动监听,随着滚动 距离来设置标题栏 颜色透明度和字体颜色 透明度 * 获取 顶部 图片高度后,设置滚动监听 */...//滑 动到 banner下面设置普通颜色 textView .setBackgroundColor(Color.argb((int) 255, 144,151,166));...其实并不难,只是我们没有亲 自动 手去实现,相信多动手自己亲自去实现一下,UI想要 我们都可以实现。 源码地址:欢迎Star,fork,有问题多多指正。

    1.5K 1 0

    移动端那些戳中你痛点 软键盘问题及解决方法

    Android 软键盘弹起表现 同样,在 Android 上,输入框获取 焦点 ,键盘弹起,但是页面(webview)高度会发生 改变 ,一般来说,高度为可视区高度(原高度减去软键盘高度),除了因为页面内容被撑开可以产生滚动...IOS 软键盘收起表现 触发软键盘上 “收起”按钮键盘或者输入框以外 页面区域时,输入框失去 焦点 ,软键盘收起。 Android 软键盘收起表现 触发输入框以外 区域时,输入框失去 焦点 ,软键盘收起。...为了解决这个问题,ios设计者们让webview上 ,但滚动 结果有些出乎意料:输入框本身可以理解地滚 动到 了实际可视区域 正中间,但 fixed 元素不会发生重新计算,而是保持原来 相对位置,跟着输入框一起被上推...这其实可能只适用于我这种情景,这个解决办法 原理是:scrollIntoView(true)想让输入框 顶部 动到 与可视区 顶部 齐平 效果,但是由于ios键盘弹起之后最大滚动距离等于键盘 高度,所以,通过这个方法会让...解决办法: 当键盘收起时,加入下面其中一种办法就可以解决 滚 动到 顶部 window.scrollTo(0,0) 滚 动到 底部 window.scrollTo(0, Math.max(document.body.clientHeight

    8.4K 3 0

    Android 开发笔记(四十四)动态UI事件

    常用 几个事件 动画事件主要用于Animation控件,可监控动画开始、结束、重播等 行为 。...动画事件 具体实现代码可参考《 Android 开发笔记(二十一)横幅轮播页Banner》。 翻页事件,主要用于ViewPager控件,可监控翻页状态变化、滚动、选定等 行为 。...在博文《 Android 开发笔记(二十) 顶部 导航栏ActionBar》里面,博主提到ActionBar自带 搜索框SearchView,但是SearchView存在几点不足: 1、搜索按钮只能显示图标,...: 设置下拉列表 宽度 setSingleLine : 设置列表中 每个元素是否单行显示 示例代码主要实现了三个功能: 1、在文本框一开始获得 焦点 时, 自动 弹出历史搜索关键词下拉列表; 2、...点击下拉列表 某项,文本框 自动 填入该项 关键词文本; 3、点击搜索按钮,主页面通过回调获得搜索关键词,从而能够做进一步 处理; 下面是AutoCompleteTextView方式 效果图 ?

    1.1K 1 0

    让你 布局滚动起来—ScrollView

    注意: ScrollView 子元素只能有一个,可以是一个 View(如 ImageView、 TextView 等) 也可以是一个 ViewGroup(如 LinearLayout、 RelativeLayout...2. android :overScrollMode="never" 删除 ScrollView拉到尽头( 顶部 、底部),然后继续拉出现 阴影效果,适用于2.3及以上 否则不用设置。...4. android :descendantFocusability="" 该属性是当一个为view获取 焦点 时,定义 ViewGroup和其子控件两者之间 关系。...属性 值有三种: beforeDescendants //viewgroup会优先其子类控件而获取到 焦点 afterDescendants //viewgroup只有当其子类控件不需要获取 焦点 时才获取 焦点 ...} 滑动位置控制 scrollView.post(new Runnable() { @Override public void run() { //滑 动到 顶部

    3.5K 3 0

    ViewPager,ScrollView 嵌套ViewPager滑动冲突解决

    Layout 里面多多个孩子 时候,当下面一个孩子是 RecyclerView 或者ListView 时候,往往会 自动 动到 ListView 或者 RecyclerView 第一个 item,导致进入界面的时候会导致...mNoHorizontalScrollView.scrollTo(0,0);方法,滑 动到 顶部 ,因为onWindowFocusChanged是在所有View绘制完毕 时候才会回调 ,不熟悉的话建议先回去看一下...,让其获取 焦点 view.setFocusable(true); view.setFocusableInTouchMode(true); view.requestFocus(); 这段代码在初始化 时候就让该界面的 顶部 某一个控件获得 焦点 ...(true); view.requestFocus(); 这段代码在初始化 时候就让该界面的 顶部 某一个控件获得 焦点 ,滚动条自然就显示到 顶部 了。...但是该方法存在缺点,就是当我们上面的view如果滑 动到 一半 时候,切换到下一个Fragment,在切换回来 时候,RecyclerView 第一个item会 自动 动到 顶部

    5.7K 5 1

    Android 之MaterialDesign应用技术

    design,中文是设计之意,即“设想和计划,设想是目的,计划是过程安排”,通常指有目标和计划 创作 行为 、活动。在这个竞争激烈 数字化信息时代,企业建立自己 网站已经刻不容缓。...>  1.2:Activity具体代码 SwipeDismissBehavior主要是控制控件 行为 ,LayoutParams是布局参数, textview 这个控件是在协调者布局中滑动 ,所以,要获取该布局 参数...,然后再设置 行为 。...2.1:创建布局文件 外层是协调者布局,中间就是一个类似于listview RecyclerView,和一个右下角 返回 顶部 按钮。...比如说,toolbar在何时显示,可以选择只要是上滑就显示,也可以选择是滑到最上面的内容才显示,这个例子就是滑 动到 最上面的内容toolbar再显示。

    1.3K 9 0

    ViewPager,ScrollView 嵌套ViewPager滑动冲突解决

    Layout 里面多多个孩子 时候,当下面一个孩子是 RecyclerView 或者ListView 时候,往往会 自动 动到 ListView 或者 RecyclerView 第一个 item,导致进入界面的时候会导致...,主要要一下两种方法 第一种方法,重写Activity onWindowFocusChanged()方法,在里面调用mNoHorizontalScrollView.scrollTo(0,0);方法,滑 动到 顶部 ...,让其获取 焦点 view.setFocusable(true); view.setFocusableInTouchMode(true); view.requestFocus(); 这段代码在初始化 时候就让该界面的 顶部 某一个控件获得 焦点 ...(true); view.requestFocus(); 这段代码在初始化 时候就让该界面的 顶部 某一个控件获得 焦点 ,滚动条自然就显示到 顶部 了。...但是该方法存在缺点,就是当我们上面的view如果滑 动到 一半 时候,切换到下一个Fragment,在切换回来 时候,RecyclerView 第一个item会 自动 动到 顶部

    665 1 0

    吸顶效果解决方案

    一.场景 “吸顶”是一种比较老 交互方式,在PC页面已经用了很多年了,如图: sticky 吸顶元素 初始位置一般靠近页面 顶部 ,但与 顶部 有一定距离,这块区域放 是最醒目的元素,比如Banner图...(最重要 元素通常固定在页面 顶部 ,navbar-fixed-top) 二.PC解决方案 页面滚 动到 一定位置时,做一些事情 “回到 顶部 ”按钮也是这样 ,页面向下滚动超过150px时,显示该按钮,否则隐藏...” 实现方式一模一样,效果好像还不错,但很快会发现滚 动到 临界位置stickyT 时候,页面抖了一下,向上缩了一截。...监听滚动判断位置 方法完全失效,平滑吸顶效果变成了 过临界位置直到停止滚动时,吸顶元素跳到目标位置,体验非常差,不可忍受 scroll不能用,但还可以有一些 奇怪 思路,比如定时器读scrollTop,touchmove...提供了另一种方式:position: sticky,自IOS 6.1就支持了,最近Chrome56才支持 这个CSS规则专门负责吸顶,一般用法: .sticky { // 过初始位置时 自动 吸顶

    3.5K 1 0

    Android 模仿实现微博详情页滑动固定 顶部 效果实例

    简单Demo 传统套路: 写两个一模一样 固定栏,外层用帧布局(FrameLayout)包裹,然后把外层 固定栏先隐藏,当内层 固定栏滑 动到 外层固定栏位置 时候,把内层固定栏隐藏,外层 固定栏显示,反之滑回来 时候把外层固定栏隐藏...:gravity="center" android :orientation="vertical" < TextView android :id="@+id/tv_topView" android ...,当我们页面滑 动到 指定点 时候,需要把内层 “我是内层固定布局”移除,同时添加到外层 ViewGroup(LinearLayout)中。...,就可以在回调接口里拿到对应 滑动数据,其中第二个参数t就是滑动y轴 距离,现在我们只需要拿到固定布局到 顶部 距离就可以判断什么时候需要移除和添加View了。...,得到 结果都为0,由于此时Activity还没有得到 焦点 ,依附在Activity View自然也就得不到数据,所以我们需要在onResume后去进行对View 数据获取。

    1.2K 2 0

    自定义一个仿拼多多地址选择器

    选择好之后,如果点击Tab会切换到相应地区级别,并且滚 动到 之前选择 地区显示,创建新 Tab就默认滚 动到 第一个position 位置。 其次,来看看我们这个界面的布局: < TextView android :id="@+id/user_tv_dialog_title" android :layout_width...-- 顶部 TabLayout --> < android .support.design.widget.TabLayout android :id="@+id/user_tb_dialog_tab...Tab,并且RecyclerView滚 动到 顶部 tabLayout.addTab(createTab(), true); recyclerView.smoothScrollToPosition...之前我是这么做 ,但是会出 奇怪 问题:在市级重新选择之后,移除后面的tab后再重新选县级之后,TabLayout 横线不会移 动到 镇级上了。

    1.6K 2 0

    Android 开发笔记(一百六十四)仿京东首页 下拉刷新

    倒是第三点 下拉刷新,以及第二点 上拉监听,却不容易实现。 虽然 Android 提供了专门 下拉刷新布局SwipeRefreshLayout,但它并没有页面随手势下 效果。...因此若想呈现完全仿照京东 下拉刷新特效,只能由开发者编写一个自定义 布局控件了。 自定义 下拉刷新布局,首先要能够区分是页面的正常下 ,还是拉伸头部要求刷新。...所以此处得捕捉页面滚 动到 顶部 事件,相对应 则是页面滚 动到 底部 事件。鉴于App首页基本采用滚动视图ScrollView实现页面滚动功能,故而该问题就变成了如何监听该视图滚到 顶部 或者滚到底部。...正好ScrollView提供了滚动 行为 变化方法onScrollChanged,通过重写该方法即可判断是否到达 顶部 或底部,重写后 代码片段如下所示:     protected void onScrollChanged...新 上层视图需要完成以下三项任务: 一、在下层视图 最前面 自动 添加一个下拉刷新头部,保证该下拉头部位于整个页面的最上方; 二、给前面自定义 滚动视图注册滚动监听器和触摸监听器,其中滚动监听器用于处理到达 顶部

    2.9K 4 0

    Android 基于RecyclerView实现 歌词滚动自定义控件

    ((;′⌒`)) 接下来说一下实现原理: 该控件分为以下几个部分: 歌词 自动 滚动 歌词颜色字体变化 触碰屏幕歌词不滚动,高亮显示,离开时 自动 动到 当前歌词位置 触碰屏幕中间线条出现以及显示该歌词 时间...mWordList); wordList.add(""); wordList.add(""); wordList.add(""); wordList.add(""); 由于歌词 自动 滚动是根据歌词时间来进行移动 ...}catch ( Exception e){ e.printStackTrace(); 3.对于歌词 自动 动到 当前语句: 本身我 想法就是多设置一个变量还是在这个 Runable...所以我们应该重新写一个 Runable() 来控制它 自动 动到 当前位置。这样子的话各做各 事情,在写逻辑 时候会比较容易理顺。.... * 歌词 自动 动到 特定位置任务 private static class AutoBackWork implements Runnable{ @Override

    1.7K 1 0

    Android ConstraintLayout详解「建议收藏」

    你可以使用 Android Studio Layout编辑器界面来手动或者 自动 指定约束。要更好 理解他,需要我们了解一下他对一个选中 widget 基本控键。...注意:该部分讲有关手动创建约束 ,需要将左上角 自动 创建约束按钮关闭 在开始之前,确保ImageView和 TextView 在layout内。...我们可以在 TextView 顶部 控键与ImageView 底部控键创建一个约束,如图: 移除约束:移除某个约束只需点击指定约束 控键;移除全部约束需要点击如下按钮: 下一步,创建ImageView...你可以点击按钮设置不同 值来 改变 margins。...调整 TextView 和Plain Text为48dp。并 自动 创建约束。 同样 选中上传button放置到右侧。

    1.9K 3 0

    Android 从零单排系列二十六】《 Android 视图控件——ScrollView》

    当布局超过屏幕大小时,ScrollView会 自动 启用滚动功能,用户可以通过滑动屏幕来查看隐藏部分 内容。...ScrollView可以嵌套其他视图组件,例如 TextView 、ImageView等,以实现滚动展示更多内容。它对于需要显示较长文本、图片或其他可滚动内容 界面非常有用。...常见方法: scrollTo(int x, int y):将ScrollView滚 动到 指定 位置,参数x和y分别代表目标位置 水平和垂直偏移量。...fullScroll(int direction):使ScrollView滚 动到 指定 边界,参数direction可以是View.FOCUS_UP(滚 动到 顶部 )或View.FOCUS_DOWN(滚 动到 底部...-- 这里可以添加更多 内容 --> < TextView android :layout_width="match_parent" android

    404 2 0