最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2025年01月20日 14:50:52   作者:淡淡的香煙  
本文介紹了Android中四種方式刷新View的方法,并討論了使用GONE狀態(tài)時(shí)可能遇到的問(wèn)題,如布局性能下降、UI體驗(yàn)不佳、數(shù)據(jù)綁定和事件監(jiān)聽(tīng)問(wèn)題,感興趣的朋友跟隨小編一起看看吧

Android四種方式刷新View

1.前言:

最近在切換主題時(shí)有個(gè)TextView是Gone的狀態(tài),切換主題后內(nèi)容沒(méi)有顯示,于是排查代碼,剛開(kāi)始以為是textView沒(méi)有設(shè)置內(nèi)容,但是打印日志和排查發(fā)現(xiàn)有setText.

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

在Android中,視圖的可見(jiàn)性狀態(tài)主要有三種:

View.VISIBLE:視圖可見(jiàn),默認(rèn)狀態(tài)。
View.INVISIBLE:視圖不可見(jiàn),但仍占據(jù)布局空間。
View.GONE:視圖不可見(jiàn),并且不再占據(jù)任何空間。

3.使用GONE導(dǎo)致的問(wèn)題:

  • 布局性能下降:在復(fù)雜的布局中,頻繁地更改視圖狀態(tài)為GONE可能會(huì)導(dǎo)致性能問(wèn)題。這是因?yàn)锳ndroid在處理布局時(shí)需要重新計(jì)算可見(jiàn)視圖的排列。
  • UI體驗(yàn)不佳:頻繁切換視圖的可見(jiàn)性可能會(huì)導(dǎo)致用戶體驗(yàn)下降。例如,用戶在點(diǎn)擊按鈕時(shí),如果需要等待布局重新排列,用戶可能會(huì)感覺(jué)卡頓。
  • 數(shù)據(jù)綁定問(wèn)題:對(duì)數(shù)據(jù)綁定的視圖進(jìn)行GONE操作可能會(huì)使得數(shù)據(jù)變更不再更新。例如,通過(guò)LiveData綁定的視圖,如果處于GONE狀態(tài),它的更新可能不會(huì)體現(xiàn)在界面上。
  • 事件監(jiān)聽(tīng)問(wèn)題:將一個(gè)視圖設(shè)置為GONE會(huì)使得它的事件監(jiān)聽(tīng)器失效,這在某些情況下可能會(huì)導(dǎo)致功能缺失

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="這是一個(gè)textview"
        android:textColor="@color/white"
        android:textSize="18sp"
        android:visibility="visible"
        tools:text="這是一個(gè)textview" />
</LinearLayout>

5.解決方式1:

4.1 使用協(xié)程刷新view

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

4.2 使用view.post刷新

    private fun initView() {
          //使用view.post刷新
          binding.textview.post {
              binding.textview.text = "這是view使用post刷新"
              Log.d(TAG,"view的內(nèi)容${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 {
    // 當(dāng)布局確定后執(zhí)行的代碼
    binding.textview.text = "這是view使用doOnLayout刷新"
}

6.遇到問(wèn)題:

  • 由于項(xiàng)目中是切換主題,view是Gone的狀態(tài),所以第5種方式是不生效的,這里不推薦使用,
  • 方式2和3這里因?yàn)関iew是隱藏狀態(tài),所以在post刷新時(shí)會(huì)閃爍一下,為了解決此需要重新繪制布局,調(diào)用view.requestLayout()或view.invalidate()都可以
  • 方式4因?yàn)轫?xiàng)目中的設(shè)備是34的,所以不需要主動(dòng)移除監(jiān)聽(tīng),在低版本是需要做移除操作

7.效果截圖:

8.完整測(cè)試代碼:

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() {
        //使用協(xié)程方式刷新
          uiScope.launch {
              binding.textview.text = "這是view使用協(xié)程刷新"
          }
        binding.textview.visibility = View.GONE
          //使用view.post刷新
          binding.textview.post {
              binding.textview.text = "這是view使用post刷新"
              Log.d(TAG,"view的內(nèi)容${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 {
            // 當(dāng)布局確定后執(zhí)行的代碼
            binding.textview.text = "這是view使用doOnLayout刷新"
        }
    }
}

9.總結(jié):

今天的使用場(chǎng)景很特殊,一般不會(huì)遇到,不過(guò)既然遇到了,就要找到問(wèn)題原因解決掉問(wèn)題,當(dāng)然解決方式有很多,這里看個(gè)人,沒(méi)有說(shuō)一定要使用哪種方式,由于是demo所以沒(méi)有做主題切換的操作,view也是直接顯示的,感興趣的同學(xué)可以自己嘗試一下再view隱藏時(shí)切換主題會(huì)不會(huì)有此問(wèn)題,打卡收工,祝大家新年快樂(lè).

10.項(xiàng)目源碼:

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

到此這篇關(guān)于Android四種方式刷新View的文章就介紹到這了,更多相關(guān)Android 刷新View內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Android中TabLayout結(jié)合ViewPager實(shí)現(xiàn)頁(yè)面切換

    Android中TabLayout結(jié)合ViewPager實(shí)現(xiàn)頁(yè)面切換

    這篇文章主要為大家詳細(xì)介紹了Android中TabLayout結(jié)合ViewPager實(shí)現(xiàn)頁(yè)面切換效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • Android學(xué)習(xí)之菜單的使用方法

    Android學(xué)習(xí)之菜單的使用方法

    這篇文章主要為大家詳細(xì)介紹了Android學(xué)習(xí)之菜單的使用方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-09-09
  • Android 按指定大小讀取圖片的實(shí)例

    Android 按指定大小讀取圖片的實(shí)例

    本文主要介紹Android 按指定大小讀取圖片,在Android開(kāi)發(fā)過(guò)程中經(jīng)常會(huì)遇到圖片超過(guò)屏幕,或者圖片過(guò)小問(wèn)題,這里給一個(gè)實(shí)例解決讀取圖片大小的問(wèn)題,希望能幫助有需要的小伙伴
    2016-07-07
  • AndroidStduio3.0 使用gradle將module打包jar文件的方法

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

    這篇文章主要介紹了AndroidStduio3.0 使用gradle將module打包jar文件的方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-04-04
  • Android自定義UI之粒子效果

    Android自定義UI之粒子效果

    這篇文章主要為大家詳細(xì)介紹了Android自定義UI之粒子效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-10-10
  • Android實(shí)現(xiàn)滑動(dòng)到頂部懸停的效果

    Android實(shí)現(xiàn)滑動(dòng)到頂部懸停的效果

    這篇文章給大家介紹一種不常見(jiàn)的實(shí)現(xiàn)Android滑動(dòng)到頂部懸停效果的方式,對(duì)大家開(kāi)發(fā)Android具有一定的參考借鑒價(jià)值,有需要的朋友們可以來(lái)一起看看。
    2016-09-09
  • Android入門(mén)教程之ListView的應(yīng)用示例

    Android入門(mén)教程之ListView的應(yīng)用示例

    這篇文章主要介紹了Android入門(mén)教程之ListView的應(yīng)用,結(jié)合簡(jiǎn)單實(shí)例形式分析了Android中l(wèi)istview的簡(jiǎn)單創(chuàng)建與使用步驟,需要的朋友可以參考下
    2016-10-10
  • Kotlin Service實(shí)現(xiàn)消息推送通知過(guò)程

    Kotlin Service實(shí)現(xiàn)消息推送通知過(guò)程

    這幾天分析了一下的啟動(dòng)過(guò)程,于是乎,今天寫(xiě)一下Service使用; 給我的感覺(jué)是它并不復(fù)雜,千萬(wàn)不要被一坨一坨的代碼嚇住了,雖然彎彎繞繞不少,重載函數(shù)一個(gè)接著一個(gè),就向走迷宮一樣,但只要抓住主線閱讀,很快就能找到出口
    2022-12-12
  • Android Studio實(shí)現(xiàn)注冊(cè)頁(yè)面跳轉(zhuǎn)登錄頁(yè)面的創(chuàng)建

    Android Studio實(shí)現(xiàn)注冊(cè)頁(yè)面跳轉(zhuǎn)登錄頁(yè)面的創(chuàng)建

    這篇文章主要為大家詳細(xì)介紹了Android Studio實(shí)現(xiàn)注冊(cè)頁(yè)面跳轉(zhuǎn)登錄頁(yè)面的創(chuàng)建,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Android開(kāi)發(fā)中PopupWindow用法實(shí)例分析

    Android開(kāi)發(fā)中PopupWindow用法實(shí)例分析

    這篇文章主要介紹了Android開(kāi)發(fā)中PopupWindow用法,結(jié)合實(shí)例形式分析了PopupWindow彈出窗口效果的使用技巧,需要的朋友可以參考下
    2016-02-02

最新評(píng)論

宜都市| 会宁县| 井陉县| 宜宾市| 胶州市| 方城县| 修水县| 昌宁县| 星子县| 苏尼特右旗| 鄢陵县| 九台市| 云林县| 建瓯市| 女性| 河源市| 泊头市| 阿合奇县| 龙门县| 乐山市| 东丰县| 土默特右旗| 五华县| 崇信县| 榆树市| 定兴县| 拜泉县| 林口县| 保亭| 宜兰县| 朝阳区| 金川县| 毕节市| 叙永县| 壶关县| 民乐县| 屏东县| 大新县| 定州市| 法库县| 永昌县|