簡體   English   中英

如何將 Kotlin 合成轉換為循環中查看膨脹 XML 的綁定?

[英]How to convert Kotlin synthetics to view binding for inflated XML in a loop?

在嘗試將應用程序從已失效的 Kotlin 合成轉換為更新/支持的視圖綁定方法時,我遇到了這個問題,其中布局在循環中膨脹並附加到目標父視圖:

for (item in itemList) {
  val view = LayoutInflater.from(this).inflate(R.layout.imageitem_row, binding.linear, false)
  view.text1.text = item.title
  view.text2.text = item.pubdate
  binding.linear.addView(view)
}

由於 Kotlin 合成正在從代碼中刪除,因此text1text2不是view有效屬性。 那么如何將視圖綁定應用到這個膨脹的布局呢? 或者這在這里不起作用,我應該使用findViewById()代替text1text2

只是為了解釋發生了什么 - 使用合成庫,它基本上是在活動本身(或其他)中進行視圖綁定。 對於布局中帶有 id 的每個視圖,它添加了一個您可以直接訪問的屬性。 所以你可以在當前范圍內調用text1.text ,它會自動綁定到層次結構中的視圖。

使用視圖綁定,沒有魔法,也沒有將屬性扔到頂級范圍內。 相反,每個布局都有一個自動生成的類,並在名稱的末尾添加了Binding ,例如ImageItemRowBinding 這個類有一個屬性,每個視圖都有一個id,所以它都封裝在一個地方。

您可以在其上調用bind(view)以獲取分配了所有屬性的實例(通過在您傳入的view層次結構中找到它們),或者如果您還沒有視圖並且想要它,則可以調用inflate在它具有約束力的同時膨脹它。 您最終會得到一個綁定類的實例,並分配了所有視圖屬性(並且您可以通過root屬性訪問視圖層次結構的頂部)。

除此之外,基本上是一樣的! 您只需要手動創建綁定實例,並通過它訪問您的視圖。 不要忘記,您可以使用像with(binding)binding.run { }類的 Kotlin 函數來處理其屬性,而無需每次都使用binding前綴,因此如果方便,您幾乎可以將原始的基於合成的代碼包裝起來

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM