我有一個 3x4 矩陣中有 12 個影像視圖的活動。我想以編程方式用不同的資源替換每個 ImageView 的影像和其他屬性。我似乎找不到任何方法來回圈遍歷視圖,因此必須對每個更改進行硬編碼。我設法將 ImageViews 放入一個陣列中,這有幫助,但我希望有更好的方法。我查看了 KotlinX.Synthetic 和資料/視圖系結,但它們似乎沒有幫助。例如,要創建 ImageView 陣列,我必須這樣做:
var imgArray = arrayOf(findViewById<ImageView>(R.id.img01))
imgArray = findViewById<ImageView>(R.id.img02)
imgArray = findViewById<ImageView>(R.id.img03)
imgArray = findViewById<ImageView>(R.id.img04)
imgArray = findViewById<ImageView>(R.id.img05)
imgArray = findViewById<ImageView>(R.id.img06)
imgArray = findViewById<ImageView>(R.id.img07)
imgArray = findViewById<ImageView>(R.id.img08)
imgArray = findViewById<ImageView>(R.id.img09)
imgArray = findViewById<ImageView>(R.id.img10)
imgArray = findViewById<ImageView>(R.id.img11)
imgArray = findViewById<ImageView>(R.id.img12)
我希望做類似的事情:
var i = 1
for (listView in listViews) {
imgArray = findViewById<ImageView>("R.id.img" i.tostring())
i
}
但這顯然行不通。任何幫助將非常感激。我對其他語言有一些經驗,但對 kotlin/java/android 不熟悉。
uj5u.com熱心網友回復:
我通常走的路是
val imageViews = listOf(R.id.img1, R.id.img2, R.id.img3).map(findViewById(it))
這將在一行中為您構建一個視圖串列。
或者resources.getIdentifier("nameOfDrawable", "drawable", this.getPackageName()),如果您真的不想讓串列保持最新并且名稱沒有變化,則可以獲取給定名稱的 id。
uj5u.com熱心網友回復:
我通常使用Gabe 回答中的第一個示例,僅列出 ID 并使用它來創建可以迭代的有用集合。但這里有幾個其他選項可能更合適,具體取決于具體情況:
查找給定型別的所有視圖
container.children.filterIsInstance<ImageView>()
這需要對 a 的參考ViewGroup(例如 aConstraintLayout等GridLayout),并且基本上會拉出View某種型別的所有 s。如果它們以某種容器布局進行組織,則很有用,如果所有內容都在同一級別上(例如 aConstraintLayout鼓勵您這樣做)并且View您不希望包含其他相同型別的 s,則不是那么有用。
此外,這僅適用于容器的直接后代,即以它為父物件的東西。如果這些東西中的任何一個都有自己的后代,則它們不包括在內(盡管請參閱下面的函式!)
使用標簽
標簽是一些資料,您可以添加到 aView中,在 XML 中使用tag屬性,或在代碼中使用setTag. ImageView如果無法在層次結構中組織它們,您可以使用它來識別您想要的 s。(層次結構更好,因為一旦建立起來就沒有作業,也沒有什么可忘記的——你只需將你的視圖與其他視圖放在一起。)
有一個findViewWithTag函式,但它只回傳一個View,當你有一個你想要抓取的組時,這并不好。所以我們可以撰寫一個輔助函式來獲取a 的所有后代ViewGroup(不僅僅是它的直接子代):
fun ViewGroup.getAllDescendants(): Sequence<View> =
children children.filterIsInstance<ViewGroup>().flatMap { it.getAllDescendants() }
(這很有用,因為它可以處理View嵌套層次結構中的 s,因此它也可以幫助實作上述filterByInstance方法,如果你有一個容器,你需要的一切都在里面,但作為內部層次結構的一部分。)
現在您可以使用它來獲取View層次結構中的每一個,并過濾您想要的標簽
// start with the root view, e.g. 'view' or 'binding.root' - or any container
// you want to search inside
(view as ViewGroup).getAllDescendants()
// you don't necessarily need to do this one, but it's safer and casts for you
.filterIsInstance<ImageView>()
.filter { it.tag == "cool image" }
uj5u.com熱心網友回復:
如果 ImageViews 在同一個父布局上,您可以只查詢其子布局的布局。
你得到一個兒童名單。
迭代串列。
您不必直接知道有多少影像視圖。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/518415.html
標籤:安卓循环科特林图像视图
