Androidが初めてで、アプリケーションのすべてのチェックボックスにスタイルを設定しようとしています。アプリケーションスタイルはTheme.Holoに設定されています。これは暗いため、チェックボックスが必要です。リストビューでスタイルはTheme.Holo.Lightになります。カスタムスタイルを作成しようとはしていません。以下のコードは機能しないようです。何も起こりません。リストビューには明るい紙のテクスチャとチェックボックスとチェックボックスのテキストは白です。
<style name="CustomActivityTheme" parent="@Android:style/Theme.Holo">
<item name="Android:checkboxStyle">@style/customCheckBoxStyle</item>
</style>
<style name="customCheckBoxStyle" parent="@Android:style/Widget.Holo.Light.CompoundButton.CheckBox">
</style>
また、アプリケーションにスタイルを設定する場合、個々のウィジェットにスタイルを設定できますか?
注:Android Support Library v22.1.0を使用し、APIレベル11以降をターゲットにしますか?下にスクロールして、最後の更新まで移動します。
アプリケーションのスタイルはTheme.Holoに設定されていますが、これはリストビューのチェックボックスのスタイルをTheme.Holo.Lightにしたいのですが。カスタムスタイルを作成しようとはしていません。以下のコードは機能していないようで、何も起こりません。
最初にシステムがこの動作を示す理由は明らかではないかもしれませんが、実際にメカニズムを調べると、簡単に推測できます。順を追って説明します。
まず、Widget.Holo.Light.CompoundButton.CheckBox
スタイルが定義するものを見てみましょう。物事をより明確にするために、「通常の」(非ライト)スタイル定義も追加しました。
<style name="Widget.Holo.Light.CompoundButton.CheckBox" parent="Widget.CompoundButton.CheckBox" />
<style name="Widget.Holo.CompoundButton.CheckBox" parent="Widget.CompoundButton.CheckBox" />
ご覧のとおり、どちらもWidget.CompoundButton.CheckBox
を単に別の名前でラップする空の宣言です。それでは、その親スタイルを見てみましょう。
<style name="Widget.CompoundButton.CheckBox">
<item name="Android:background">@Android:drawable/btn_check_label_background</item>
<item name="Android:button">?android:attr/listChoiceIndicatorMultiple</item>
</style>
このスタイルは、背景とボタンのドロアブルの両方を参照します。 btn_check_label_background
は単なる9パッチであるため、この問題に関してはあまり興味深いものではありません。ただし、?android:attr/listChoiceIndicatorMultiple
は、現在のテーマ(これを実現することが重要です)に基づく属性がCheckBox
の実際の外観を決定することを示します。
listChoiceIndicatorMultiple
はテーマ属性であるため、複数の宣言があります-各テーマに1つ(または親テーマから継承される場合はなし)これは次のようになります(明確にするために他の属性は省略されています)。
<style name="Theme">
<item name="listChoiceIndicatorMultiple">@Android:drawable/btn_check</item>
...
</style>
<style name="Theme.Holo">
<item name="listChoiceIndicatorMultiple">@Android:drawable/btn_check_holo_dark</item>
...
</style>
<style name="Theme.Holo.Light" parent="Theme.Light">
<item name="listChoiceIndicatorMultiple">@Android:drawable/btn_check_holo_light</item>
...
</style>
これが本当の魔法が起こる場所です:テーマのlistChoiceIndicatorMultiple
属性に基づいて、CheckBox
の実際の外観が決定されます。あなたが見ている現象は今簡単に説明されています:外観はテーマベースであり(そして、それは単なる空の定義であるため、notスタイルベースであり、あなたはTheme.Holo
から継承しています、常にテーマに一致するCheckBox
の外観を取得します。
ここで、CheckBox
の外観をHolo.Lightバージョンに変更する場合は、それらのリソースのコピーを取得してローカルアセットに追加し、カスタムスタイルを使用してそれらを適用する必要があります。
2番目の質問について:
また、アプリケーションにスタイルを設定した場合、個々のウィジェットにスタイルを設定できますか?
もちろん、アクティビティまたはアプリケーションセットのスタイルをオーバーライドします。
テーマ(画像のあるスタイル)をチェックボックスウィジェットに設定する方法はありますか。 (...)とにかくこのセレクターを使用する必要があります: link ?
更新:
Androidの内部リソースに依存することは想定されていないことをもう一度言っておきます。必要に応じて内部名前空間にアクセスできない理由があります。
ただし、結局システムリソースにアクセスする方法は、名前でIDルックアップを行うことです。次のコードスニペットを検討してください。
int id = Resources.getSystem().getIdentifier("btn_check_holo_light", "drawable", "Android");
((CheckBox) findViewById(R.id.checkbox)).setButtonDrawable(id);
最初の行は、実際にbtn_check_holo_light
drawableリソースのリソースIDを返します。これがCheckBox
の外観を決定するボタンセレクタであることを以前に確立したため、ウィジェットで「ボタン描画可能」として設定できます。結果は、xmlのアプリケーション、アクティビティ、またはウィジェットに設定したテーマ/スタイルに関係なく、Holo.Light
バージョンの外観を持つCheckBox
です。これはボタンのドロアブルのみを設定するため、他のスタイルを手動で変更する必要があります。例えばテキストの外観に関して。
結果を示すスクリーンショットの下。一番上のチェックボックスは上記の方法を使用します(xmlでテキストの色を手動で黒に設定します)、2番目のチェックボックスはデフォルトのテーマベースのHolo
スタイル(非ライト、つまり)を使用します。
Update2:
サポートライブラリv22.1.0の導入 を使用すると、状況がずっと簡単になりました!リリースノートからの引用(私の強調):
Lollipopは、
Android:theme
XML属性を使用して、ビューレベルでビューでテーマを上書きする機能を追加しました-ライトアクティビティのダークアクションバーなどに非常に便利です。現在、AppCompatでは、ツールバーでAndroid:theme
を使用でき(以前使用していたapp:theme
を廃止)、さらにさらに良いことに、API 11+デバイスのすべてのビューでAndroid:theme
をサポートします。
つまり、テーマをper-viewに基づいて適用できるようになりました。これにより、元の問題の解決がはるかに簡単になります。関連するビューに適用するテーマを指定するだけです。つまり元の質問のコンテキストで、以下の結果を比較します。
<CheckBox
...
Android:theme="@Android:style/Theme.Holo" />
<CheckBox
...
Android:theme="@Android:style/Theme.Holo.Light" />
最初のCheckBox
は、アクティビティまたはアプリケーションに設定されている実際のテーマに関係なく、暗いテーマで使用されているかのようにスタイル設定され、2番目は明るいテーマで使用されているようにスタイル設定されます。
もちろん、Holoテーマを使用するのではなく、マテリアルを使用する必要があります。
たぶんこれはあなたを満足させるでしょう-
something.xml
<CheckBox
Android:text="Custom CheckBox"
Android:button="@drawable/checkbox_selector"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"/>
セレクター
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:state_checked="true" Android:drawable="@drawable/star_down" />
<item Android:state_checked="false" Android:drawable="@drawable/star" />
</selector>
の場合、参照は単に here を参照します
マテリアルデザインのための正しい方法は次のとおりです。
スタイル :
<style name="MyCheckBox" parent="Theme.AppCompat.Light">
<item name="colorControlNormal">@color/foo</item>
<item name="colorControlActivated">@color/bar</item>
</style>
レイアウト :
<CheckBox
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:checked="true"
Android:text="Check Box"
Android:theme="@style/MyCheckBox"/>
Lollipop +のマテリアルアニメーションが保持されます。
おそらく次のようなものが必要です:
<style name="CustomActivityTheme" parent="@Android:style/Theme.Holo">
<item name="Android:checkboxStyle">@style/customCheckBoxStyle</item>
</style>
<style name="customCheckBoxStyle" parent="@Android:style/Widget.CompoundButton.CheckBox">
<item name="Android:textColor">@Android:color/black</item>
</style>
TextColorアイテムに注意してください。
前の回答のセクション<selector>...</selector>
あなたが必要があるかもしれません:
<item Android:state_pressed="true" Android:drawable="@drawable/checkbox_pressed" ></item>