Android四种方式刷新View

news/2025/1/22 1:05:41/

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.主界面布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/main"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_gravity="center"android:gravity="center"tools:context=".MainActivity"><TextViewandroid:id="@+id/textview"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginStart="40dp"android:layout_marginEnd="40dp"android:background="@color/design_default_color_primary_dark"android:gravity="center"android:text="这是一个textview"android:textColor="@color/white"android:textSize="18sp"android:visibility="visible"tools:text="这是一个textview" /></LinearLayout>

5.解决方式1:

4.1 使用协程刷新view

   private fun initView() {//使用协程方式刷新uiScope.launch {binding.textview.text = "这是view使用协程刷新"}}

在这里插入图片描述

4.2 使用view.post刷新

    private fun initView() {//使用view.post刷新binding.textview.post {binding.textview.text = "这是view使用post刷新"Log.d(TAG,"view的内容${binding.textview.text} ${binding.textview.visibility}")}}

在这里插入图片描述

4.3 使用handler.post刷新

在这里插入图片描述

4.4 使用view.viewTreeObserver刷新

private fun initView() {//使用view.viewTreeObserver刷新binding.textview.viewTreeObserver.addOnGlobalLayoutListener {binding.textview.text = "这是view使用viewTreeObserver刷新"}
}

在这里插入图片描述

4.5 使用view.doOnLayout刷新

binding.textview.doOnLayout {// 当布局确定后执行的代码binding.textview.text = "这是view使用doOnLayout刷新"
}

在这里插入图片描述

6.遇到问题:

  • 由于项目中是切换主题,view是Gone的状态,所以第5种方式是不生效的,这里不推荐使用,

  • 方式2和3这里因为view是隐藏状态,所以在post刷新时会闪烁一下,为了解决此需要重新绘制布局,调用view.requestLayout()或view.invalidate()都可以

  • 方式4因为项目中的设备是34的,所以不需要主动移除监听,在低版本是需要做移除操作

7.效果截图:

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

8.完整测试代码:

package com.cloud.viewpostdemoimport android.animation.ObjectAnimator
import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.util.Log
import android.view.View
import android.widget.LinearLayout
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.doOnLayout
import com.cloud.viewpostdemo.databinding.ActivityMainBinding
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.launchclass MainActivity : AppCompatActivity() {private val mainJob = SupervisorJob()private val uiScope = CoroutineScope(Dispatchers.Main + mainJob)private lateinit var binding: ActivityMainBindingprivate val TAG by lazy {"${javaClass.simpleName}@${System.identityHashCode(this)}"}override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)binding = ActivityMainBinding.inflate(layoutInflater)setContentView(binding.root)initView()}private fun initView() {//使用协程方式刷新uiScope.launch {binding.textview.text = "这是view使用协程刷新"}binding.textview.visibility = View.GONE//使用view.post刷新binding.textview.post {binding.textview.text = "这是view使用post刷新"Log.d(TAG,"view的内容${binding.textview.text} ${binding.textview.visibility}")}//使用handler.post刷新val handler = Handler(Looper.getMainLooper())handler.post {binding.textview.text = "这是view使用handler刷新"}//使用view.viewTreeObserver刷新binding.textview.viewTreeObserver.addOnGlobalLayoutListener {binding.textview.text = "这是view使用viewTreeObserver刷新"}binding.textview.doOnLayout {// 当布局确定后执行的代码binding.textview.text = "这是view使用doOnLayout刷新"}}
}

9.总结:

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

10.项目源码:

https://gitee.com/jackning_admin/view-post-demo


http://www.ppmy.cn/news/1565093.html

相关文章

2024年开发语言热度排名

随着技术的不断发展和变化&#xff0c;编程语言的热度也在不断演变。2024年即将到来&#xff0c;我们有必要回顾和展望当前和未来的开发语言市场。本文将基于多个因素&#xff0c;包括行业需求、社区支持、流行度以及新兴趋势&#xff0c;对2024年的开发语言热度进行排名和分析…

postgresql的用户、数据库和表

在 PostgreSQL 中&#xff0c;用户、数据库和表是关系型数据库系统的基本组成部分。理解这些概念对数据库管理和操作至关重要。下面是对这些概念的详细解释&#xff1a; 1. 用户&#xff08;User&#xff09; 在 PostgreSQL 中&#xff0c;用户&#xff08;也称为 角色&#…

手机怎么远程操控电脑?

远程看看是一款免费使用的远程控制软件&#xff0c;兼容 Windows、iOS 和 Android 系统&#xff0c;用户可以通过电脑或移动设备轻松远程控制电脑。不仅如此&#xff0c;远程看看还提供了文件传输、在线聊天和隐私屏等实用功能。如果您需要在远程操作时隐藏被控电脑的操作界面&…

2.使用Spring BootSpring AI快速构建AI应用程序

Spring AI 是基于 Spring Boot3.x 框架构建&#xff0c;Spring Boot官方提供了非常便捷的工具Spring Initializr帮助开发者快速的搭建Spring Boot应用程序,IDEA也集成了此工具。本文使用的开发工具IDEASpring Boot 3.4Spring AI 1.0.0-SNAPSHOTMaven。 1.创建Spring Boot项目 …

vim文本编辑器

vim命令的使用&#xff1a; [rootxxx ~]# touch aa.txt #首先创建一个文件 [rootxxx ~]# vim aa.txt #vim进入文件aa.txt进行编辑 vim是vi的升级版&#xff0c;具有以下三种基本模式&#xff1a; 输入模式(编辑模式) 点击i进入编辑模式 &#xff08;说明…

VIM 的 YCM 插件

1、背景 VIM 是一个非常强大的文本编辑器&#xff0c;因其高效的操作方式和丰富的插件生态系统而备受开发者喜爱。对于开发人员来说&#xff0c;代码补全和智能提示是提升编程效率的重要工具&#xff0c;而 YouCompleteMe&#xff08;YCM&#xff09; 插件就是其中一款功能强大…

芝士AI(paperzz):最新AI论文、AI降重、AI降重工具,解决论文写作低效和AI率

相信大家都有经历过毕业论文查重&#xff0c;有些严格的学校甚至只有1次查重机会&#xff0c;令人心惊胆战。“东拼西凑”的论文怎么保证查重率符合要求成为每个大学生的毕业必修课题。 芝士AI&#xff08;paperzz&#xff09;官网&#xff1a;https://www.paperzz.cn/ 不过…

Spring boot 集成分布式定时任务

Spring boot 集成分布式定时任务 定义及作用 在分布式定时任务中&#xff0c;需要一种机制来确保同一任务在不同的服务实例中不会同时执行&#xff0c;这就是分布式定时任务锁的作用。 集成 引入相关依赖 <!--shedlock--><dependency><groupId>net.java…