Как указать цвет фона в списке ресурсов Color State? - PullRequest
17 голосов
/ 17 октября 2010

Чтобы дать пользователю моего приложения указание на то, какое поле в данный момент находится в фокусе, я пытаюсь изменить цвет фона некоторых из моих полей в зависимости от текущего состояния, однако у меня возникают проблемы с пониманием ресурсов списка состояний цветов Android:

Я нашел пример (извините, URL больше не работает), и если я попробую точно то же самое, то есть, если я хочу адаптировать textColor , вещи делать работуОднако, если я попробую только немного отличную вещь, а именно адаптировать фон цвет, вещи не работают, и я не понимаю, почему?Почему это так противоречиво?

Чтобы мне было проще понять, что я пытаюсь сделать, я добавляю свою миску.XML-файлы:

Файл AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="mmo.android.test"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".Test"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest> 

Test-Activity:

package mmo.android.test;

import android.app.Activity;
import android.os.Bundle;

public class Test extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}

res/values/strings.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="hello">Hello World, Test!</string>
    <string name="app_name">Test</string>
</resources>

res/color/button_test_color.xml:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true"   android:color="#f0f"/> <!-- pressed -->
    <item android:state_focused="true"   android:color="#ff0"/> <!-- focused -->
    <item android:color="#000"/> <!-- default -->
</selector>

и, наконец, мой res/layout/main.xml файл:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="foobar"
        android:textColor="@color/button_test_color"
        android:background="#f00"
     />
    <!-- 
    <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="foobar"
        android:textColor="#f00"
        android:background="@color/button_test_color"
     />
     -->
</LinearLayout>

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

Если я раскомментирую нижнюю кнопку, где я только что перевернул значения атрибутов для textColor и background, я получу исключение, заявив

... <item> tag requires a 'drawable' attribute or child tag defining a drawable

Какого черта я здесь скучаю?Почему этот список состояний цвета приемлем как цвет текста, а не как цвет фона?Как определить цвет фона представления в зависимости от состояния представления?

Ответы [ 3 ]

55 голосов
/ 08 августа 2013

У меня была именно эта проблема.Мне кажется, android:background не работает со списками цветов.Я обошел это, создав вместо этого Drawable State State Drawable (отдельные цвета можно использовать в качестве drawables в State List).

Чтобы использовать ваш пример, создайте файл res/drawable/button_test_background.xml:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true"   android:drawable="@color/pressed_color"/>
    <item android:state_focused="true"   android:drawable="@color/focused_color"/>
    <item android:drawable="@color/default_color"/>
</selector>

Обратите внимание на использование android:drawable вместо android:color.Android будет использовать цветной ресурс и делать из него рисование.Чтобы покончить с этим, вам нужно добавить цветовые ресурсы в ваш файл res/values/colors.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    ...
    <color name="pressed_color">#f0f</color>
    <color name="focused_color">#ff0</color>
    <color name="default_color">#000</color>
    ...
</resources>

Затем вы можете обратиться к этому рисованию, используя @drawable/button_test_background вместо @color/button_test_color.

Таким образом, в итоге, список состояний цвета работает нормально для android:textColor, но для android:background необходим вышеописанный метод списка состояний.

0 голосов
/ 17 апреля 2018

Если у вас уже есть список состояний цветов, который вы хотите использовать, вы можете создать простой рисунок, подобный этому, и использовать его.

res/drawable/button_test_background.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
    <solid android:color="@color/button_test_color" />
</shape>

<Button
    ...
    android:background="@drawable/button_test_background.xml"
    ...
 />
0 голосов
/ 18 октября 2010

Попробуйте определить textColor как рисунок, а не как цвет:

android:textColor="@drawable/button_test_color"

Категории ресурсов основаны на типе ресурсов, а не на имени папки, в которой они находятся. XML-файлына форму button_test_color.xml обычно ссылаются как на «рисуемые» - я действительно удивлен, что «цвет» работал вообще!

...