web-dev-qa-db-ja.com

v21より前の色付けチェックボックス

そこで、色合いをAppCompatチェックボックスに適用したいと思います。

Lollipopではすべて正常に動作します。

Android:buttonTint="@color/purple_FF4081"

またはこの方法:

Android:theme="@style/Theme.MyTheme.PurpleAccent"

ただし、このパラメーターのいずれを設定しても、Lollipop以前のバージョンでは何も変わりません。アプリのテーマにcolorAccentを設定した場合にのみ機能します。ただし、すべてのウィジェットの外観を変更するのではなく、チェックボックスを1つだけ変更します。色付きのドロアブルを設定せずにこれを行う方法はありますか?

22
bluebyte

AppCompatActivityと新しいサポートライブラリの導入後にこれがすべて変更されたことを簡単に説明します。 参考のために(ここで美しく説明されています) チェックボックスに色を付けることができますtheme属性を使用して、colorControlNormalおよびcolorControlActivatedを設定します。

styles.xml

<style name="MyCheckBox" parent="Theme.AppCompat.Light">  
<item name="colorControlNormal">@color/Indigo</item>
<item name="colorControlActivated">@color/pink</item>
</style> 

レイアウトxml:

<CheckBox  
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:checked="true"
        Android:text="Check Box"
        Android:theme="@style/MyCheckBox"/>
62
Daniel Wilson

Xmlで直接色を付けることができます。ボックスにbuttonTintを使用します:(APIレベル23以降)

<CheckBox
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:buttonTint="@color/CHECK_COLOR" />

古いAPIのappCompatCheckbox v7を使用してこれを行うこともできます。

<Android.support.v7.widget.AppCompatCheckBox 
    Android:layout_width="wrap_content" 
    Android:layout_height="wrap_content" 
    app:buttonTint="@color/COLOR_HERE" />
25
Anudeep Samaiya

私はプログラムでそれを行う必要がありました。少しの間掘り下げた後、最終的にこのソリューションを見つけました(キットカットとマシュマロでテストしました)、誰かに役立つ場合にだけ投稿します:

public static void setAppCompatCheckBoxColors(final AppCompatCheckBox _checkbox, final int _uncheckedColor, final int _checkedColor) {
    int[][] states = new int[][]{new int[]{-Android.R.attr.state_checked}, new int[]{Android.R.attr.state_checked}};
    int[] colors = new int[]{_uncheckedColor, _checkedColor};
    _checkbox.setSupportButtonTintList(new ColorStateList(states, colors));
}
11
androidseb

私はすべての答えを試してみましたが、これだけがうまくいきます。属性colorControlNormalcolorControlActivatedをアクティビティ全体(またはアプリケーション)のベーススタイルに追加して、コントローラからテーマを削除します

ここに例があります

    <style name="AppTheme" parent="AppTheme.Base"/>

  <style name="AppTheme.Base" parent="Theme.AppCompat.Light.NoActionBar">

         <!-- colorPrimary is used for the default action bar background -->
        <item name="colorPrimary">@color/colorPrimary</item>

        <!-- colorPrimaryDark is used for the status bar -->
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>

        <!-- colorAccent is used as the default value for colorControlActivated,
             which is used to tint widgets -->
        <item name="colorAccent">@color/colorAccent</item>
      <!-- to hide white screen in start of window -->
      <item name="Android:windowIsTranslucent">true</item>

     <item name="colorControlNormal">@color/orange_two</item>
      <item name="colorControlActivated">@color/pumpkin_orange</item>


    </style>

あなたのメインフェスト

<application
        Android:allowBackup="true"
        Android:icon="@mipmap/ic_launcher"
        Android:label="@string/app_name"
        Android:supportsRtl="true"
        Android:theme="@style/AppTheme"> // here is the style used 
        <activity Android:name=".MainActivity">
            <intent-filter>
                <action Android:name="Android.intent.action.MAIN" />

                <category Android:name="Android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
2
Mina Fawzy

EDIT 6/28/16:以下の答えはもはや正しくありません。 appcompatライブラリを使用してv21以前のデバイスでGoogleが色付けを許可した新しい方法について、受け入れられている回答を参照してください。


元の答え:

短い答えは:いいえ。 v21より前のデバイスで使用するには、カスタムDrawableを作成する必要があります。これは、現時点では未完​​成の実装の詳細であるため、特別な色合い認識ウィジェットが現在非表示になっているためです(Googleは、これは将来変更される可能性があると述べています、 開発者ブログ FAQセクション)

動作する可能性のあるcolorAccentをオーバーライドできるシナリオは2つあります。

  • ウィジェットの独自のカスタムバージョンを持っている(つまり、EditTextを拡張した)
  • LayoutInflaterなしでEditTextを作成します(つまり、new EditText()を呼び出します)。
1
opt05