自助建网站哪个好,网站维护建设招标,网站做签到功能,网站平台被骗了怎么办Android四种方式刷新View
1.前言#xff1a;
最近在切换主题时有个TextView是Gone的状态#xff0c;切换主题后内容没有显示#xff0c;于是排查代码#xff0c;刚开始以为是textView没有设置内容#xff0c;但是打印日志和排查发现有setText.
2.View.VISIBLE与View.GO…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 version1.0 encodingutf-8?
LinearLayout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:apphttp://schemas.android.com/apk/res-autoxmlns:toolshttp://schemas.android.com/toolsandroid:idid/mainandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentandroid:layout_gravitycenterandroid:gravitycentertools:context.MainActivityTextViewandroid:idid/textviewandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:layout_marginStart40dpandroid:layout_marginEnd40dpandroid:backgroundcolor/design_default_color_primary_darkandroid:gravitycenterandroid:text这是一个textviewandroid:textColorcolor/whiteandroid:textSize18spandroid:visibilityvisibletools:text这是一个textview //LinearLayout5.解决方式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