web-dev-qa-db-ja.com

カラー状態リストリソースで背景色を指定するにはどうすればよいですか?

アプリのユーザーに現在フォーカスがあるフィールドを示すために、現在の状態に応じて一部のフィールドの背景色を変更しようとしていますが、Androidのカラー状態リストのリソースを理解するのに問題があります。

私は例を見つけました(申し訳ありませんが、URLはもう機能しません)そして私が正確に同じことを試みた場合、つまり私がtextColor、物事doは機能します。ただし、わずかに異なることだけを試してみると、つまりbackground色、物事が機能しない理由がわかりませんか?なぜこれはそれほど一貫性がないのですか?

私がやろうとしていることを理解しやすくするために、その他を追加します。 .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

私はここで何が欠けていますか?その色の状態リストがテキストの色として受け入れられるが、背景色として受け入れられないのはなぜですか?ビューの状態に応じて、ビューの背景色をどのように指定しますか?

20
mmo

TextColorを色ではなく、描画可能なものとして定義してみてください。

Android:textColor="@drawable/button_test_color"

リソースカテゴリは、それらが配置されているフォルダの名前ではなく、リソースの種類に基づいています。button_test_color.xml形式のXMLファイルは、通常、「描画可能」として参照されます。実際、「色」がまったく機能していないことに驚いています。 !

0
Aaron C

私はこの正確な問題を抱えていました。 Android:backgroundはカラー状態リストでは機能しないように見えます。代わりにStateList Drawableを作成することでこれを回避しました(個々の色はState ListのDrawableとして使用できます)。

例を使用するには、ファイル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に対しては、上記の状態リストDrawableメソッドが必要です。

57
Dockheas23

すでにカラー状態リストがあり、使用したい場合は、このような単純なドローアブルを作成して使用できます。

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
Ridcully