android - Kotlin/Android:递归查找所有T型 View

标签 android recursion kotlin stack extension-function

所以我对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是一个LinearLayout,其中包含三个Button

最佳答案

为什么在特定情况下使用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的Log.i()替换了println()记录器:
    tabs.allViewsOfType<Button> {
        println("Dale: ${it.text}")
    }
    
  • 现在您的函数可以正常工作:
    I/System.out: Dale: Button 4
                  Dale: Button 3
                  Dale: Button 2
                  Dale: Button 1
    
  • 关于android - Kotlin/Android:递归查找所有T型 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52865769/

    相关文章:

    android - 为什么在调用 setRetainInstance(true) 时,TextView 的文本没有恢复?

    java - 如何在不覆盖的情况下将数据推送到 firebase

    android - Android Studio 中的 GC 和 java 堆分析

    recursion - 这可以在 Prolog 中进行尾递归吗?

    java - 未找到 sun.security.ssl.SSLSessionImpl

    java - Android Studio codestyles/Project.xml 配置

    javascript - 来自 iframe 的 Android WebView postMessage 和 Assets 中的页面

    java - 这是递归的正确使用吗?

    c++ - 调用函数并使用 goto : memory leak? 将其转义

    android - 无法解析 com.google.guava :guava:30. 1-jre - Gradle 项目同步失败。基本功能将无法正常工作 - 在 kotlin 项目中