Kotlin/Android: 递归查找类型 T 的所有视图
Kotlin/Android: Finding all Views of type T recursively
所以我有 ViewGroup
的扩展功能:
inline fun <reified T : View> ViewGroup.allViewsOfType(action: (T) -> Unit)
{
val views = Stack<View>()
afterMeasured {
views.addAll((0 until childCount).map(this::getChildAt))
}
while (!views.isEmpty()) {
views.pop().let {
if (it is T) action(it)
if (it is ViewGroup) {
afterMeasured {
views.addAll((0 until childCount).map(this::getChildAt))
}
}
}
}
}
我是这样使用的:
tabs.allViewsOfType<Button> { Log.i("Dale", it.text.toString()) }
但不知何故它不起作用。我做错了什么吗?
顺便说一句,tabs
是一个包含三个 Button
的 LinearLayout
。
为什么在特定情况下使用 afterMeasure
?
我刚刚删除了afterMeasure
:
inline fun <reified T : View> ViewGroup.allViewsOfType(action: (T) -> Unit) {
val views = Stack<View>()
views.addAll((0 until childCount).map(this::getChildAt))
while (!views.isEmpty()) {
views.pop().let {
if (it is T) action(it)
if (it is ViewGroup) {
views.addAll((0 until childCount).map(this::getChildAt))
}
}
}
}
用简单的 Kotlin println()
:
替换了 Log.i()
记录器
tabs.allViewsOfType<Button> {
println("Dale: ${it.text}")
}
现在你的函数工作正常了:
I/System.out: Dale: Button 4
Dale: Button 3
Dale: Button 2
Dale: Button 1
所以我有 ViewGroup
的扩展功能:
inline fun <reified T : View> ViewGroup.allViewsOfType(action: (T) -> Unit)
{
val views = Stack<View>()
afterMeasured {
views.addAll((0 until childCount).map(this::getChildAt))
}
while (!views.isEmpty()) {
views.pop().let {
if (it is T) action(it)
if (it is ViewGroup) {
afterMeasured {
views.addAll((0 until childCount).map(this::getChildAt))
}
}
}
}
}
我是这样使用的:
tabs.allViewsOfType<Button> { Log.i("Dale", it.text.toString()) }
但不知何故它不起作用。我做错了什么吗?
顺便说一句,tabs
是一个包含三个 Button
的 LinearLayout
。
为什么在特定情况下使用 afterMeasure
?
我刚刚删除了
afterMeasure
:inline fun <reified T : View> ViewGroup.allViewsOfType(action: (T) -> Unit) { val views = Stack<View>() views.addAll((0 until childCount).map(this::getChildAt)) while (!views.isEmpty()) { views.pop().let { if (it is T) action(it) if (it is ViewGroup) { views.addAll((0 until childCount).map(this::getChildAt)) } } } }
用简单的 Kotlin
替换了println()
:Log.i()
记录器tabs.allViewsOfType<Button> { println("Dale: ${it.text}") }
现在你的函数工作正常了:
I/System.out: Dale: Button 4 Dale: Button 3 Dale: Button 2 Dale: Button 1