Неправильно заданы цвета при настройке из XML - работает в коде - PullRequest
0 голосов
/ 16 марта 2012

Я борюсь с очень странным поведением в моем приложении для Android. У меня есть TextView, где цвета фона и текста устанавливаются динамически в зависимости от некоторых условий. Для упрощения некоторые условия проверяются на наличие ошибок, и таким образом устанавливаются цвета для текстового представления (обратите внимание, что макет фрейма, к которому добавлено текстовое представление, имеет цвет фона @android:color/black):

TextView tv = new TextView(this);
((FrameLayout)this.findViewById(R.id.text_frame)).add(tv);

String val = getValue();
tv.setText(val);

if(isError(val)) {
    tv.setBackGroundColor(R.color.bg_error);
    tv.setTextColor(R.color.txt_error);
}
else {
    tv.setBackGroundColor(R.color.bg_normal);
    tv.setTextColor(R.color.txt_normal);
}

Цвета определены в XML следующим образом:

<color name="bg_normal">#ffffff</color>
<color name="bg_error">#ff0000</color>
<color name="txt_normal">#0000ff</color>
<color name="txt_error">#008080</color>

Я не ожидал ничего странного в этом коде, поскольку много раз использовал подобные вещи. Однако в этом случае этот код не работает. Независимо от того, что я пытаюсь сделать, цвета текста и фона текстового представления остаются черными.

Теперь, если я изменю свой код на следующий, все работает отлично.

if(isError(val)) {
    tv.setBackGroundColor(Color.rgb(255, 0, 0));
    tv.setTextColor(Color.rgb(0, 128, 128));
}
else {
    tv.setBackGroundColor(Color.rgb(255, 255, 255));
    tv.setTextColor(Color.rgb(0, 0, 255);
}

Хотя я, конечно, могу оставить это так (это работает - зачем это исправлять?), Я бы предпочел получить цвета из XML, так как было бы намного проще поддерживать и изменять позже.

У кого-нибудь есть идеи относительно того, что может быть за проблема и как ее решить?

P.S. Я опущу предположение, что я создаю текстовое представление в XML и устанавливаю его цвета там, говоря, что это упрощенный код. Существует много таких текстовых представлений, которые создаются динамически, и их количество зависит от внешнего параметра. Во время кодирования я не знаю, будет ли 1 такой просмотр текста или 100.

1 Ответ

3 голосов
/ 16 марта 2012

setBackgroundColor() принимает цвет, закодированный в int. Однако вы указываете идентификатор ресурса, который приведет к неверным / другим результатам. 100

Скорее получите цвет, закодированный из ресурсов как это:

tv.setBackGroundColor(getResources().getColor(R.color.bg_normal));

¹ учитывая, что это странный дизайн, из-за которого вам приходится спотыкаться, другие установщики ресурсов также принимают int почти последовательно для res-идентификатора. Это несколько особый случай. :)

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