web-dev-qa-db-ja.com

Androidチェックボックススタイル

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>

また、アプリケーションにスタイルを設定する場合、個々のウィジェットにスタイルを設定できますか?

41
user1330739

: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スタイル(非ライト、つまり)を使用します。

Screenshot showing the result


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テーマを使用するのではなく、マテリアルを使用する必要があります。

120
MH.

たぶんこれはあなたを満足させるでしょう-

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 を参照します

58
Praveenkumar

マテリアルデザインのための正しい方法は次のとおりです。

スタイル :

<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 +のマテリアルアニメーションが保持されます。

22
Rémy DAVID

おそらく次のようなものが必要です:

<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アイテムに注意してください。

4
Edwin Evans

前の回答のセクション<selector>...</selector> あなたが必要があるかもしれません:

<item Android:state_pressed="true" Android:drawable="@drawable/checkbox_pressed" ></item>
1
Alex Che