设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间08 现在时间09 缓存数据 生活如海,宽容作舟,泛舟于海,方知海之宽阔;生活如歌,宽容是曲,和曲而歌,方知生活甜美。早安

我们所有的努力所有的奋斗,都是为了拥有一个美好的未来。和遇见更好的自己。请把努力当成一种习惯,而不是三分钟热度。每一个你羡慕的收获,都是努力用心拼来的。早安!

查看: 845|回复: 0

Android四种方式刷新View的操作方法

[复制链接]

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
37
主题
31
精华
0
金钱
109
积分
68
注册时间
2023-10-3
最后登录
2025-5-31

发表于 2025-5-31 06:48:22 | 显示全部楼层 |阅读模式
Android四种方式刷新View


1.前言:

最近在切换主题时有个TextView是Gone的状态,切换主题后内容没有显示,于是排查代码,刚开始以为是textView没有设置内容,但是打印日志和排查发现有setText.

2.View.VISIBLE与View.GONE的基本概念:

在Android中,视图的可见性状态主要有三种:
View.VISIBLE:视图可见,默认状态。
View.INVISIBLE:视图不可见,但仍占据布局空间。
View.GONE:视图不可见,并且不再占据任何空间。

3.使用GONE导致的问题:


  • 布局性能下降:在复杂的布局中,频繁地更改视图状态为GONE可能会导致性能问题。这是因为Android在处理布局时需要重新计算可见视图的排列。
  • UI体验不佳:频繁切换视图的可见性可能会导致用户体验下降。例如,用户在点击按钮时,如果需要等待布局重新排列,用户可能会感觉卡顿。
  • 数据绑定问题:对数据绑定的视图进行GONE操作可能会使得数据变更不再更新。例如,通过LiveData绑定的视图,如果处于GONE状态,它的更新可能不会体现在界面上。
  • 事件监听问题:将一个视图设置为GONE会使得它的事件监听器失效,这在某些情况下可能会导致功能缺失

4.主界面布局:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     xmlns:app="http://schemas.android.com/apk/res-auto"
  4.     xmlns:tools="http://schemas.android.com/tools"
  5.     android:id="@+id/main"
  6.     android:layout_width="match_parent"
  7.     android:layout_height="match_parent"
  8.     android:layout_gravity="center"
  9.     android:gravity="center"
  10.     tools:context=".MainActivity">
  11.     <TextView
  12.         android:id="@+id/textview"
  13.         android:layout_width="match_parent"
  14.         android:layout_height="wrap_content"
  15.         android:layout_marginStart="40dp"
  16.         android:layout_marginEnd="40dp"
  17.         android:background="@color/design_default_color_primary_dark"
  18.         android:gravity="center"
  19.         android:text="这是一个textview"
  20.         android:textColor="@color/white"
  21.         android:textSize="18sp"
  22.         android:visibility="visible"
  23.         tools:text="这是一个textview" />
  24. </LinearLayout>
复制代码
5.解决方式1:


4.1 使用协程刷新view
  1.    private fun initView() {
  2.        //使用协程方式刷新
  3.          uiScope.launch {
  4.              binding.textview.text = "这是view使用协程刷新"
  5.          }
  6.    }
复制代码
1.png


4.2 使用view.post刷新
  1.     private fun initView() {
  2.           //使用view.post刷新
  3.           binding.textview.post {
  4.               binding.textview.text = "这是view使用post刷新"
  5.               Log.d(TAG,"view的内容${binding.textview.text} ${binding.textview.visibility}")
  6.           }
  7.     }
复制代码
2.png


4.3 使用handler.post刷新

3.png


4.4 使用view.viewTreeObserver刷新
  1. private fun initView() {
  2.       //使用view.viewTreeObserver刷新
  3.       binding.textview.viewTreeObserver.addOnGlobalLayoutListener {
  4.           binding.textview.text = "这是view使用viewTreeObserver刷新"
  5.       }
  6. }
复制代码
4.png


4.5 使用view.doOnLayout刷新
  1. binding.textview.doOnLayout {
  2.     // 当布局确定后执行的代码
  3.     binding.textview.text = "这是view使用doOnLayout刷新"
  4. }
复制代码
5.png


6.遇到问题:


  • 由于项目中是切换主题,view是Gone的状态,所以第5种方式是不生效的,这里不推荐使用,
  • 方式2和3这里因为view是隐藏状态,所以在post刷新时会闪烁一下,为了解决此需要重新绘制布局,调用view.requestLayout()或view.invalidate()都可以
  • 方式4因为项目中的设备是34的,所以不需要主动移除监听,在低版本是需要做移除操作

7.效果截图:

6.png

7.png

8.png

9.png

10.png


8.完整测试代码:
  1. package com.cloud.viewpostdemo
  2. import android.animation.ObjectAnimator
  3. import android.os.Bundle
  4. import android.os.Handler
  5. import android.os.Looper
  6. import android.util.Log
  7. import android.view.View
  8. import android.widget.LinearLayout
  9. import androidx.appcompat.app.AppCompatActivity
  10. import androidx.core.view.doOnLayout
  11. import com.cloud.viewpostdemo.databinding.ActivityMainBinding
  12. import kotlinx.coroutines.CoroutineScope
  13. import kotlinx.coroutines.Dispatchers
  14. import kotlinx.coroutines.SupervisorJob
  15. import kotlinx.coroutines.launch
  16. class MainActivity : AppCompatActivity() {
  17.     private val mainJob = SupervisorJob()
  18.     private val uiScope = CoroutineScope(Dispatchers.Main + mainJob)
  19.     private lateinit var binding: ActivityMainBinding
  20.     private val TAG by lazy {
  21.         "${javaClass.simpleName}@${System.identityHashCode(this)}"
  22.     }
  23.     override fun onCreate(savedInstanceState: Bundle?) {
  24.         super.onCreate(savedInstanceState)
  25.         binding = ActivityMainBinding.inflate(layoutInflater)
  26.         setContentView(binding.root)
  27.         initView()
  28.     }
  29.     private fun initView() {
  30.         //使用协程方式刷新
  31.           uiScope.launch {
  32.               binding.textview.text = "这是view使用协程刷新"
  33.           }
  34.         binding.textview.visibility = View.GONE
  35.           //使用view.post刷新
  36.           binding.textview.post {
  37.               binding.textview.text = "这是view使用post刷新"
  38.               Log.d(TAG,"view的内容${binding.textview.text} ${binding.textview.visibility}")
  39.           }
  40.           //使用handler.post刷新
  41.           val handler = Handler(Looper.getMainLooper())
  42.           handler.post {
  43.               binding.textview.text = "这是view使用handler刷新"
  44.           }
  45.           //使用view.viewTreeObserver刷新
  46.           binding.textview.viewTreeObserver.addOnGlobalLayoutListener {
  47.               binding.textview.text = "这是view使用viewTreeObserver刷新"
  48.           }
  49.         binding.textview.doOnLayout {
  50.             // 当布局确定后执行的代码
  51.             binding.textview.text = "这是view使用doOnLayout刷新"
  52.         }
  53.     }
  54. }
复制代码
9.总结:

今天的使用场景很特殊,一般不会遇到,不过既然遇到了,就要找到问题原因解决掉问题,当然解决方式有很多,这里看个人,没有说一定要使用哪种方式,由于是demo所以没有做主题切换的操作,view也是直接显示的,感兴趣的同学可以自己尝试一下再view隐藏时切换主题会不会有此问题,打卡收工,祝大家新年快乐.

10.项目源码:

https://gitee.com/jackning_admin/view-post-demo
到此这篇关于Android四种方式刷新View的文章就介绍到这了,更多相关Android 刷新View内容请搜索晓枫资讯以前的文章或继续浏览下面的相关文章希望大家以后多多支持晓枫资讯!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表