1. ホーム
  2. android

[解決済み] AppCompatライブラリからSwitchCompatの色を変更する方法 [重複]について

2022-04-28 04:07:32

質問

私のアプリケーションには、異なる色を持ついくつかのスイッチコントロールがあり、それらの色を変更するために、複数のカスタム描画可能なセレクタを使用しました。

新しい android.support.v7.widget.SwitchCompat コントロールは、AppCompat v21 ライブラリのリリースで導入されました。

SwitchCompatの色を、カスタマーのdrawableセレクタを使わずに、XMLやコードでプログラム的に変更することは可能でしょうか?

解決方法は?

AppCompatの色合い属性について。

まず、appCompat libの記事を見てください。 そこ と、設定できる属性が異なります。

カラープライマリ : アプリの主要なブランディングカラーです。デフォルトでは、アクションバーの背景に適用される色です。

カラープライマリダーク : ブランド主要色のダークバージョン。デフォルトでは、ステータスバー(statusBarColorを使用)とナビゲーションバー(navigationBarColorを使用)に適用される色です。

カラーアクセント : ブランディングの主要色を明るく補う。デフォルトでは、フレームワークコントロールに適用される色です(colorControlActivatedを使用)。

カラーコントロールノーマル : 通常状態のフレームワークコントロールに適用される色です。

カラーコントロールアクティブ : フレームワークコントロールがアクティブ(チェック、スイッチオンなど)状態のときに適用される色です。

カラーコントロールハイライト : フレームワーク制御のハイライトに適用される色(例:リップル、リストセレクタ)。

カラーボタンノーマル : フレームワークボタンの通常時の色です。

カラースイッチサム・ノーマル : フレームワークスイッチのサムネイルが通常状態の時に適用される色です。(スイッチオフ)


1つのアクティビティですべてのカスタムスイッチが同じである場合。

これまでの属性で、各アクティビティに独自のテーマを定義することができます。

<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>


1つのアクティビティで、異なるカスタムスイッチを使用したい場合。

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"/>


SwitchCompatのトラックカラーを変更する場合

vine'thさんのおかげで、Switch Off時のTrackのForegroundを指定する方法を説明したSO answerへのリンクで、私の回答が完成しました、それは その場 .