以编程方式在视图组中找到所有按钮

时间:2018-10-27 15:47:31

标签: android arrays class kotlin components

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

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

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

button class = "buttons"

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

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

谢谢!

2 个答案:

答案 0 :(得分:0)

类似的事情应该起作用:

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)
    }
}

要首先调用它,请首先为您活动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是实际根目录布局的占位符)

然后,在“活动”中调用setContentView()之后,调用函数:

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

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


或者,您可以修改this strategy,为按钮提供连续的ID,尽管您会因此失去一些可读性。

答案 1 :(得分:0)

您可以通过解析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