Найти все кнопки в группе просмотра программно - PullRequest
0 голосов
/ 27 октября 2018

Я пытался найти способ избежать необходимости вручную назначать компоненты, созданные в режиме разработки, для переменных массива, но безуспешно.Я имею в виду, вместо того, чтобы делать это так:

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, если это ограничение языковой поддержки) и вручную присваивает каждый элемент переменной массива на самом деле единственный вариант, который естьявляется?Я очень надеюсь, что нет ...

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 27 октября 2018

Этого можно добиться, анализируя 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
0 голосов
/ 27 октября 2018

Что-то вроде этого должно работать:

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

Для первоначального вызова сначала присвойте корневому элементу View XML-файла вашей активности идентификатор:

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

После того, как это закончится, *Переменная 1016 * будет содержать ссылки на все кнопки в вашем макете.


В качестве альтернативы, вы можете изменить эту стратегию , присвоив вашим кнопкам последовательные идентификаторы, хотя при этом вы потеряете некоторую читаемость..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...