【问题标题】:Find all buttons in view group programmatically以编程方式查找视图组中的所有按钮
【发布时间】:2019-04-01 02:15:46
【问题描述】:

我一直试图找到一种方法来避免将我在设计模式下创建的组件手动分配给数组变量,但没有成功。我的意思是,不必这样做:

val myButtons = ArrayOf (bt0, bt1, bt2,bt3..bt30...

我想知道是否有一种方法可以遍历应用程序中创建的所有按钮(或任何其他组件)并通过它们的类索引调用它们,就像在 HTML 中一样:

button class = "buttons"

这样,在 HTML 中,我可以使用 JavaScript/jQuery 创建和操作任意数量的按钮,只需分别使用 getElementByClassName $(". buttons")

即使在旧的良好 VisualBasic 6 次中,每当我复制一个组件并粘贴它的副本时,VB 都会询问我是否应该创建这些组件的数组,如果是,它会为每个新组件分配一个索引粘贴。通过这种方式,我可以使用 for/each 循环或单独通过它们的索引以编程方式操作它们。 在 Android Studio 中是否不可能做到这一点(我正在使用 Kotlin,但如果它是一种语言支持限制,我很乐意转向 Java)并且每次手动将每个元素分配给一个数组变量真的是唯一的选择是?我真的希望不会……

提前致谢!

【问题讨论】:

    标签: android arrays class kotlin components


    【解决方案1】:

    这样的事情应该可以工作:

    private val buttons = ArrayList<Button>() //this is a global variable
    
    private fun loopThrough(parent: ViewGroup) {
        for (i in 0 until parent.childCount) {
            val child = parent.getChildAt(i)
    
            if (child is Button) buttons.add(child)
            else if (child is ViewGroup) loopThrough(child)
        }
    }
    

    要开始调用它,首先要为 Activity 的 XML 的根 View 元素指定一个 ID:

    <YourRootLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/root">
    
        <!--...-->
    
    </YourRootLayout>
    

    YourRootLayout 是您实际根布局的占位符)

    然后,在你的Activity中调用setContentView()之后,调用函数:

    loopThrough(findViewById<ViewGroup>(R.id.root))
    

    完成后,buttons 变量将保存对布局中所有按钮的引用。


    或者,您可以修改 this strategy,为您的按钮提供顺序 ID,尽管这样做会失去一些可读性。

    【讨论】:

    • 这就是我想要的!我承认,如果 child 不是按钮,我恐怕无法理解 else if 部分的作用。看起来它试图在父视图中的其他视图中查找按钮,对吗?如果是这样,我认为这是完美的,因为我的按钮是在 TableLayout 内的 TableRows 内组织的,但是您的解决方案在不需要任何 TableRow id 的情况下列出了我的所有 27 个按钮,并且它也像预期的那样忽略了 TableView 之外的第 28 个按钮(即按钮应该是独立的)。非常感谢你的帮助! (无法投票,抱歉)
    • 它使用递归。它传递了一个 ViewGroup(可以包含其他 View 的任何 View),然后循环通过该 ViewGroup 的子项。如果它找到一个是 Button 的子元素,则将其添加到 Buttons 列表中。否则,如果子也是一个 ViewGroup,它将递归调用该函数,然后循环遍历该子 ViewGroup。
    • 谢谢,我认为可能是这样。它就像一个魅力。谢谢!
    【解决方案2】:

    可以通过解析xml来实现

    Java 代码

    val inputFile = File("src/in.xml")
    val docFactory = DocumentBuilderFactory.newInstance()
    val docBuilder = docFactory.newDocumentBuilder()
    val doc = docBuilder.parse(inputFile)
    val nodes = doc.getElementsByTagName("**buttonTagName**")
    

    此文件的导入将是

    import org.w3c.dom.Element
    import java.io.File
    import java.util.*
    import javax.xml.parsers.DocumentBuilderFactory
    import javax.xml.soap.Node
    import javax.xml.transform.TransformerFactory
    import javax.xml.transform.dom.DOMSource
    import javax.xml.transform.stream.StreamResult
    

    【讨论】:

    • 谢谢!在这种特殊情况下,我认为我仍然应该手动提供按钮 Id 或 tagName ,不是吗?我仍然知道有一种方法(我自己从来没有做过)在读取 XML 文件时自动列出所有我要标记的标签。我正在考虑它,但第一个答案完全解决了我的问题。无论如何,再次感谢您!
    • P.S.:我无法投票支持权限限制,抱歉,但我肯定会将此解决方案用于我的项目的其他想法,再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-09
    • 2012-11-19
    • 2013-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多