Как связать объявления и операторы If?

Я хочу изменить несколько цветов textView с помощью пары операторов if. Все они имеют разные идентификаторы, за исключением последней части, которая заканчивается на ".... Цена". Я попытался просто вставить операторы if для всех из них, но сборка не удалась.

я делал подобные заявления.

textView1Price = ("+10.00") textView2Price = ("-10.00") textView3Price = ("0.00")

и такие операторы if.

 if (colorID.text.startsWith("-")) {
        colorID.setTextColor(Color.RED)
    }
 if (colorID.text.startsWith("+")) {
        colorID.setTextColor(Color.GREEN)
    }
 if (colorID.text.startsWith("0.00")) {
        colorID.text = "_"
        colorID.setTextColor(Color.DKGRAY)

Мне сложно понять, как связать объявления с операторами If. Я пробовал что-то подобное с частичным успехом, но не могу перечислить более одного объявления.

val colorID = textView1Price

я также попытался найти способ сослаться на

text.contains("Price")

но пока не смогли. Любая помощь приветствуется. Спасибо за ваше время.

Обновлено: Решение Последующее действие

//Declarations
//metal location A price
Price1 = ("+10.00")
//metal location B price
Price2 = ("-10.00")
//metal location C price
Price3 = ("0.00")

Android Studio предложила, когда утверждение завершено, если

(1..912).forEach {
        val id = resources.getIdentifier("Price$it", "id", packageName)
        val tv = findViewById<TextView>(id)
        when {
            tv.text.startsWith("-") -> tv.setTextColor(Color.RED)
            tv.text.startsWith("+") -> tv.setTextColor(Color.GREEN)
            tv.text.startsWith("0.00") -> {
                tv.text = "_"
                tv.setTextColor(Color.DKGRAY)
            }
        }
    }
0
0
62
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Для TextView, которые имеют идентификаторы, такие как textView?Price, вы можете использовать метод getIdentifier(), чтобы получить их целочисленные идентификаторы в цикле, а затем применить такие условия, как это (для 9 TextView):

(1..9).forEach {
    val id = resources.getIdentifier("textView${it}Price", "id", packageName)
    val tv = findViewById<TextView>(id)
    if (tv.text.startsWith("-")) {
        tv.setTextColor(Color.RED)
    } else if (tv.text.startsWith("+")) {
        tv.setTextColor(Color.GREEN)
    } else if (tv.text.startsWith("0.00")) {
        tv.text = "_"
        tv.setTextColor(Color.DKGRAY)
    }
}

Для resources и packageName вам может потребоваться предоставить действующий Context, например:

val id = context.resources.getIdentifier("textView${it}Price", "id", context.packageName)

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

Спасибо за комментарий. Я новичок в этом. Не могли бы вы уточнить немного подробнее? Для (1..9) .forEach что делать, если у меня нет определенной суммы? Пример textView # Price предназначен для удобства. В идентификаторах каждого из них общим фактором является только цена. Простите за неудобства.

randbo 01.01.2019 22:07

Я предполагаю, что у вас есть текстовые представления, такие как textView1Price, textView2Price, ... если последний идентификатор - textView1000Price, вам просто нужно изменить диапазон на (1..1000). Если идентификаторы не имеют такого сходства, этот код работать не будет.

forpas 01.01.2019 22:10

Я думаю, что справлюсь с этой работой. Мне просто нужно комментировать все записи, чтобы я мог отслеживать значения. пример NewYorkPrice =. будет изменен на textView1Price с комментарием выше о Нью-Йорке. Спасибо за вашу помощь, я это ценю.

randbo 01.01.2019 22:19

В качестве примечания я обычно использую with(tv) { when { text.startsWith() -> ... } } для Kotlin.

shkschneider 02.01.2019 14:57

Другие вопросы по теме