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

 更新时间:2025年01月20日 14:50:52   作者:淡淡的香烟  
本文介绍了Android中四种方式刷新View的方法,并讨论了使用GONE状态时可能遇到的问题,如布局性能下降、UI体验不佳、数据绑定和事件监听问题,感兴趣的朋友跟随小编一起看看吧

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">
    <TextView
        android: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.viewpostdemo
import 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.launch
class MainActivity : AppCompatActivity() {
    private val mainJob = SupervisorJob()
    private val uiScope = CoroutineScope(Dispatchers.Main + mainJob)
    private lateinit var binding: ActivityMainBinding
    private 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

到此这篇关于Android四种方式刷新View的文章就介绍到这了,更多相关Android 刷新View内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Android中TabLayout结合ViewPager实现页面切换

    Android中TabLayout结合ViewPager实现页面切换

    这篇文章主要为大家详细介绍了Android中TabLayout结合ViewPager实现页面切换效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • Android学习之菜单的使用方法

    Android学习之菜单的使用方法

    这篇文章主要为大家详细介绍了Android学习之菜单的使用方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-09-09
  • Android 按指定大小读取图片的实例

    Android 按指定大小读取图片的实例

    本文主要介绍Android 按指定大小读取图片,在Android开发过程中经常会遇到图片超过屏幕,或者图片过小问题,这里给一个实例解决读取图片大小的问题,希望能帮助有需要的小伙伴
    2016-07-07
  • AndroidStduio3.0 使用gradle将module打包jar文件的方法

    AndroidStduio3.0 使用gradle将module打包jar文件的方法

    这篇文章主要介绍了AndroidStduio3.0 使用gradle将module打包jar文件的方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-04-04
  • Android自定义UI之粒子效果

    Android自定义UI之粒子效果

    这篇文章主要为大家详细介绍了Android自定义UI之粒子效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-10-10
  • Android实现滑动到顶部悬停的效果

    Android实现滑动到顶部悬停的效果

    这篇文章给大家介绍一种不常见的实现Android滑动到顶部悬停效果的方式,对大家开发Android具有一定的参考借鉴价值,有需要的朋友们可以来一起看看。
    2016-09-09
  • Android入门教程之ListView的应用示例

    Android入门教程之ListView的应用示例

    这篇文章主要介绍了Android入门教程之ListView的应用,结合简单实例形式分析了Android中listview的简单创建与使用步骤,需要的朋友可以参考下
    2016-10-10
  • Kotlin Service实现消息推送通知过程

    Kotlin Service实现消息推送通知过程

    这几天分析了一下的启动过程,于是乎,今天写一下Service使用; 给我的感觉是它并不复杂,千万不要被一坨一坨的代码吓住了,虽然弯弯绕绕不少,重载函数一个接着一个,就向走迷宫一样,但只要抓住主线阅读,很快就能找到出口
    2022-12-12
  • Android Studio实现注册页面跳转登录页面的创建

    Android Studio实现注册页面跳转登录页面的创建

    这篇文章主要为大家详细介绍了Android Studio实现注册页面跳转登录页面的创建,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • Android开发中PopupWindow用法实例分析

    Android开发中PopupWindow用法实例分析

    这篇文章主要介绍了Android开发中PopupWindow用法,结合实例形式分析了PopupWindow弹出窗口效果的使用技巧,需要的朋友可以参考下
    2016-02-02

最新评论