アプリケーションに異なる色のスイッチ コントロールがいくつかあり、それらの色を変更するために、複数のカスタム ドローアブル セレクターを使用しました。
AppCompat v21 ライブラリのリリースで、新しい android.support.v7.widget.SwitchCompat コントロールが導入されました。
顧客の描画可能なセレクターを使用せずに、プログラムで SwitchCompat の色を変更することは可能ですが、XML またはコードを使用することはできますか?
アプリケーションに異なる色のスイッチ コントロールがいくつかあり、それらの色を変更するために、複数のカスタム ドローアブル セレクターを使用しました。
AppCompat v21 ライブラリのリリースで、新しい android.support.v7.widget.SwitchCompat コントロールが導入されました。
顧客の描画可能なセレクターを使用せずに、プログラムで SwitchCompat の色を変更することは可能ですが、XML またはコードを使用することはできますか?
まず、そこにある appCompat lib の記事と、設定できるさまざまな属性を確認する必要があります。
colorPrimary : アプリの主要なブランディング カラー。デフォルトでは、これはアクション バーの背景に適用される色です。
colorPrimaryDark : プライマリ ブランド カラーのダーク バリアント。デフォルトでは、これはステータス バー (statusBarColor 経由) とナビゲーション バー (navigationBarColor 経由) に適用される色です。
colorAccent : 主要なブランディング カラーを明るく補います。デフォルトでは、これはフレームワーク コントロールに適用される色です (colorControlActivated を介して)。
colorControlNormal : 通常の状態でフレームワーク コントロールに適用される色。
colorControlActivated : フレームワーク コントロールがアクティブ化された (チェックされている、スイッチがオンになっている) 状態で適用される色。
colorControlHighlight : フレームワーク コントロールのハイライト (リップル、リスト セレクターなど) に適用される色。
colorButtonNormal : 通常の状態でフレームワーク ボタンに適用される色。
colorSwitchThumbNormal : 通常の状態でフレームワーク スイッチ サムに適用される色。(スイッチオフ)
以前の属性を使用して、アクティビティごとに独自のテーマを定義できます。
<style name="Theme.MyActivityTheme" parent="Theme.AppCompat.Light">
<!-- colorPrimary is used for the default action bar background -->
<item name="colorPrimary">@color/my_awesome_color</item>
<!-- colorPrimaryDark is used for the status bar -->
<item name="colorPrimaryDark">@color/my_awesome_darker_color</item>
<!-- colorAccent is used as the default value for colorControlActivated,
which is used to tint widgets -->
<item name="colorAccent">@color/accent</item>
<!-- You can also set colorControlNormal, colorControlActivated
colorControlHighlight, and colorSwitchThumbNormal. -->
</style>
と :
<manifest>
...
<activity
android:name=".MainActivity"
android:theme="@style/Theme.MyActivityTheme">
</activity>
...
</manifest>
appcompat でのウィジェットの色付けは、レイアウトのインフレーションをインターセプトし、特別な色付け対応バージョンのウィジェットをその場所に挿入することで機能するため (Chris Banesの投稿を参照してください)、レイアウト xml ファイルの各スイッチにカスタム スタイルを適用することはできません。適切な色で切り替えを行うカスタム コンテキストを設定する必要があります。
--
5.0 より前のバージョンでこれを行うには、カスタム属性でグローバル テーマをオーバーレイする Context を作成し、プログラムでスイッチを作成する必要があります。
ContextThemeWrapper ctw = ContextThemeWrapper(getActivity(), R.style.Color1SwitchStyle);
SwitchCompat sc = new SwitchCompat(ctw)
AppCompat の時点でv22.1
、次XML
を使用してテーマをスイッチ ウィジェットに適用できます。
<RelativeLayout
xmlns:app="http://schemas.android.com/apk/res-auto"
...>
<android.support.v7.widget.SwitchCompat
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:theme="@style/Color1SwitchStyle"/>
カスタム スイッチ テーマ:
<style name="Color1SwitchStyle">
<item name="colorControlActivated">@color/my_awesome_color</item>
</style>
--
Android 5.0では、新しいビュー属性が有効になったように見えます: android:theme
(マニフェストでのアクティビティ宣言の使用と同じ)。別の Chris Banesの投稿に基づいて、後者を使用すると、レイアウト xml からビューにカスタム テーマを直接定義できるはずです。
<android.support.v7.widget.SwitchCompat
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:theme="@style/Color1SwitchStyle"/>
vine'th のおかげで、Switch が Off のときにトラックの前景を指定する方法を説明する SO answer へのリンクで回答を完成させました。
申し訳ありませんが、これらの回答のほとんどは不完全であるか、小さなバグがあります。@ austyn-mahoney からの非常に完全な回答は正しく、この回答のソースですが、複雑で、おそらくスイッチのスタイルを設定したいだけです。Android の異なるバージョン間でコントロールを「スタイリング」することは、お尻の大きな苦痛です。非常に厳しいデザイン制約のあるプロジェクトで何日も頭を悩ませた後、最終的に分解してテストアプリを作成し、スイッチとチェックボックスをスタイリングするためにそこにあるさまざまなソリューションを実際に掘り下げてテストしました。それはしばしば他のものを持っています。これが私が見つけたものです...
まず、実際にどちらにもスタイルを設定することはできませんが、テーマをすべてに適用することも、1 つだけに適用することもできます。
2 番目:すべて XML から実行でき、2 番目の値 v21/styles.xml は必要ありません。
3 番目:スイッチに関しては、古いバージョンの Android をサポートしたい場合、基本的な選択肢が 2 つあります (あなたもきっとそうだと思います)...
SwitchCompat
と、プラットフォーム間で同じように見せることができます。Switch
、テーマの残りの部分、またはその特定のスイッチだけでテーマを設定できます。Android の古いバージョンでは、スタイルのない古い正方形のスイッチが表示されます。さて、簡単な参照コードです。単純な Hello World! を作成する場合も同様です。このコードをドロップして、心ゆくまでプレイできます。ここではすべて定型文なので、アクティビティとスタイルの XML を含めるだけにします...
activity_main.xml...
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.kunai.switchtest.MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="'Styled' SwitchCompat" />
<android.support.v7.widget.SwitchCompat
android:id="@+id/switch_item"
android:layout_width="wrap_content"
android:layout_height="46dp"
android:layout_alignParentEnd="true"
android:layout_marginEnd="16dp"
android:checked="true"
android:longClickable="false"
android:textOff="OFF"
android:textOn="ON"
app:switchTextAppearance="@style/BrandedSwitch.text"
app:theme="@style/BrandedSwitch.control"
app:showText="true" />
</RelativeLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.kunai.switchtest.MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Themed SwitchCompat" />
<android.support.v7.widget.SwitchCompat
android:id="@+id/switch_item2"
android:layout_width="wrap_content"
android:layout_height="46dp"
android:layout_alignParentEnd="true"
android:layout_marginEnd="16dp"
android:checked="true"
android:longClickable="false" />
</RelativeLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.kunai.switchtest.MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Themed Switch" />
<Switch
android:id="@+id/switch_item3"
android:layout_width="wrap_content"
android:layout_height="46dp"
android:layout_alignParentEnd="true"
android:layout_marginEnd="16dp"
android:checked="true"
android:longClickable="false"
android:textOff="OFF"
android:textOn="ON"/>
</RelativeLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.kunai.switchtest.MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="'Styled' Switch" />
<Switch
android:id="@+id/switch_item4"
android:layout_width="wrap_content"
android:layout_height="46dp"
android:layout_alignParentEnd="true"
android:layout_marginEnd="16dp"
android:checked="true"
android:longClickable="false"
android:textOff="OFF"
android:textOn="ON"
android:theme="@style/BrandedSwitch"/>
</RelativeLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.kunai.switchtest.MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="'Styled' CheckBox" />
<CheckBox
android:id="@+id/checkbox"
android:layout_width="wrap_content"
android:layout_height="46dp"
android:layout_alignParentEnd="true"
android:layout_marginEnd="16dp"
android:checked="true"
android:longClickable="false"
android:theme="@style/BrandedCheckBox"/>
</RelativeLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.kunai.switchtest.MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Themed CheckBox" />
<CheckBox
android:id="@+id/checkbox2"
android:layout_width="wrap_content"
android:layout_height="46dp"
android:layout_alignParentEnd="true"
android:layout_marginEnd="16dp"
android:checked="true"
android:longClickable="false"/>
</RelativeLayout>
スタイル.xml...
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">#3F51B5</item>
<item name="colorPrimaryDark">#303F9F</item>
<item name="colorAccent">#FF4081</item>
</style>
<style name="BrandedSwitch.control" parent="Theme.AppCompat.Light">
<!-- active thumb & track color (30% transparency) -->
<item name="colorControlActivated">#e6e600</item>
<item name="colorSwitchThumbNormal">#cc0000</item>
</style>
<style name="BrandedSwitch.text" parent="Theme.AppCompat.Light">
<item name="android:textColor">#ffa000</item>
<item name="android:textSize">9dp</item>
</style>
<style name="BrandedCheckBox" parent="AppTheme">
<item name="colorAccent">#aaf000</item>
<item name="colorControlNormal">#ff0000</item>
</style>
<style name="BrandedSwitch" parent="AppTheme">
<item name="colorAccent">#39ac39</item>
</style>
私は知っています、私は知っています、あなたはこれを構築するのが面倒です.コードを書いてチェックインしたいだけです.Android互換性の悪夢のバグでこの痛みを閉じて、チームのデザイナーが最終的に満足できるようにすることができます. . わかった。実行するとこんな感じ・・・
API_21:
API_18:
以下のリンクの答えがより良いと思います
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
...
<!-- Active thumb color & Active track color(30% transparency) -->
<item name="colorControlActivated">@color/theme</item>
<!-- Inactive thumb color -->
<item name="colorSwitchThumbNormal">@color/grey300</item>
<!-- Inactive track color(30% transparency) -->
<item name="android:colorForeground">@color/grey600</item>
...
</style>
そのため、脳細胞が不足している日があります。
<android.support.v7.widget.SwitchCompat
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/CustomSwitchStyle"/>
スタイルが正しくないため、テーマは適用されません。app:theme :P を使用することになっていた
<android.support.v7.widget.SwitchCompat
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:theme="@style/CustomSwitchStyle"/>
おっと。この投稿は、私の過ちについての洞察を与えてくれました...うまくいけば、誰かがこれに出くわした場合、それが私のように彼らを助けるでしょう. Gaëtan Maisse さん、ご回答ありがとうございます。
SwitchCompat の既知のバグに注意してください
これは、AppCompat https://code.google.com/p/android/issues/detail?id=78262の drawable-hdpi の破損したファイルのバグです 。
それを修正するには、この 2 つのファイルでオーバーライドするだけです https://github.com/lopespm/quick-fix-switchcompat-resources ディレクトリ drawable-hdpi に追加します
XML
<android.support.v7.widget.SwitchCompat
android:id="@+id/dev_switch_show_dev_only"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
Javaでは何も必要ありませんでした
<android.support.v7.widget.SwitchCompat
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/adamSwitch"
android:textColor="@color/top_color"
android:textAppearance="@color/top_color"
android:gravity="center"
app:showText="true"
app:theme="@style/Custom.Widget.SwitchCompat"
app:switchPadding="5dp"
/>
style.xml で
<style name="Custom.Widget.SwitchCompat" parent="Widget.AppCompat.CompoundButton.Switch" >
<item name="android:textColorPrimary">@color/blue</item> <!--textColor on activated state -->
</style>