44人参与 • 2025-02-13 • Android
最近在切换主题时有个textview是gone的状态,切换主题后内容没有显示,于是排查代码,刚开始以为是textview没有设置内容,但是打印日志和排查发现有settext.
在android中,视图的可见性状态主要有三种:
view.visible:视图可见,默认状态。
view.invisible:视图不可见,但仍占据布局空间。
view.gone:视图不可见,并且不再占据任何空间。
<?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>
private fun initview() { //使用协程方式刷新 uiscope.launch { binding.textview.text = "这是view使用协程刷新" } }
private fun initview() { //使用view.post刷新 binding.textview.post { binding.textview.text = "这是view使用post刷新" log.d(tag,"view的内容${binding.textview.text} ${binding.textview.visibility}") } }
private fun initview() { //使用view.viewtreeobserver刷新 binding.textview.viewtreeobserver.addongloballayoutlistener { binding.textview.text = "这是view使用viewtreeobserver刷新" } }
binding.textview.doonlayout { // 当布局确定后执行的代码 binding.textview.text = "这是view使用doonlayout刷新" }
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刷新" } } }
今天的使用场景很特殊,一般不会遇到,不过既然遇到了,就要找到问题原因解决掉问题,当然解决方式有很多,这里看个人,没有说一定要使用哪种方式,由于是demo所以没有做主题切换的操作,view也是直接显示的,感兴趣的同学可以自己尝试一下再view隐藏时切换主题会不会有此问题,打卡收工,祝大家新年快乐.
https://gitee.com/jackning_admin/view-post-demo
到此这篇关于android四种方式刷新view的文章就介绍到这了,更多相关android 刷新view内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论