アプリのユーザーに現在フォーカスがあるフィールドを示すために、現在の状態に応じて一部のフィールドの背景色を変更しようとしていますが、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
私はここで何が欠けていますか?その色の状態リストがテキストの色として受け入れられるが、背景色として受け入れられないのはなぜですか?ビューの状態に応じて、ビューの背景色をどのように指定しますか?
TextColorを色ではなく、描画可能なものとして定義してみてください。
Android:textColor="@drawable/button_test_color"
リソースカテゴリは、それらが配置されているフォルダの名前ではなく、リソースの種類に基づいています。button_test_color.xml形式のXMLファイルは、通常、「描画可能」として参照されます。実際、「色」がまったく機能していないことに驚いています。 !
私はこの正確な問題を抱えていました。 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メソッドが必要です。
すでにカラー状態リストがあり、使用したい場合は、このような単純なドローアブルを作成して使用できます。
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"
...
/>