質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

1回答

4845閲覧

[Android Studio] ダークモードへの切替え styles.xmlのtextColorを複数指定する方法

aheshiyu

総合スコア13

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2020/08/21 12:44

編集2020/08/22 03:28

実現したいこと

Android Studio での Android アプリ開発において,ダークモードのオン・オフによるTextViewtextColorの設定について,一部にだけ別のstylesを適用させたいです.(分かりにくいと思うため,読み進めて理解していただきたいですm(_ _)m)

現状

問題点

現状のダークモードのオン・オフによるアプリ全体のデザインは以下の通りです.

背景文字色
ダークモード(オン)黒色白色
ダークモード(オフ)白色黒色

単純にこのデザインを適用するならば,アプリ全体のtextColor

xml

1<!-- ダークモード例 --> 2<style name="DarkTheme" parent="Theme.AppCompat"> 3 ... 4 <item name="android:textColor">@color/whiteColor</item> 5 ... 6</style>

のように,自作のstyleandroid:textColorとして色を設定することができます.

しかし,アプリのデザイン上,以下の場合も考えられます.

||背景|TextViewの背景|文字色|
|:--|:--:|:--:|
|ダークモード(オン)|黒色|白色|白色|
|ダークモード(オフ)|白色|黒色|黒色|

このような場合,上記で示したstyles.xmlではすべてのtextColorが,ダークモードがオンであれば「白色」,オフであれば「黒色」となってしまい,TextViewの背景と同化してしまいます.

ダークモードへの切替え

現状のダークモードへの切り替えはsetThemeを使い,アクティビティを再描画することで実現しています.
参考サイト:AndroidのThemeを無理矢理動的に変更したよっていう話

主なstyles.xmlは以下の通りです.

xml

1<!-- ダークモード(オフ) --> 2<style name="WhiteTheme" parent="Theme.AppCompat.Light"> 3 ... 4</style> 5 6<!-- ダークモード(オン) --> 7<style name="DarkTheme" parent="Theme.AppCompat"> 8 ... 9</style>

また,切替えはSwitchによるオン・オフのみです.

アイデアと理想

考えられるアイデアとしては,通常ではない色にするTextViewなどにidを設定し,どうにかしてtextColorを別に設定することだと思いました.(アイデアのみで実現はできていません)

そのイメージ(理想)がこちらです.

xml

1<!-- 通常のTextView(idの有無は任意) --> 2<TextView 3 ... /> 4 5<!-- textColorを変更したいTextView(idを付加) --> 6<TextView 7 android:id="@+id/my_text" 8 ... />

xml

1<!-- ダークモード(オフ) --> 2<style name="WhiteTheme" parent="Theme.AppCompat.Light"> 3 ... 4 <item name="android:textColor">@color/blackColor</item> 5 <item name="my_text/android:textColor">@color/whiteColor</item> 6 ... 7</style> 8 9<!-- ダークモード(オン) --> 10<style name="DarkTheme" parent="Theme.AppCompat"> 11 ... 12 <item name="android:textColor">@color/whiteColor</item> 13 <item name="my_text/android:textColor">@color/blackColor</item> 14 ... 15</style>

恐らく,というか絶対に無理ですが,styleの中でidを指定してtextColorを変更したいということです.

なお,現状のダークモードへの切替えは,Switchを用いてテーマを切り替えるだけで実現できており,テーマの切替え以外での色変更は望んでいません.すなわち,プログラム上でfindViewByIdで直接参照・編集は望まないということです.

また,もしプログラムでの提案がある場合は,言語はJavaでお願いいたします.

実現したいこと(もう一度)

以上がアプリの現状と課題についてでした.

冒頭でも実現したいことは書いており,おおよそ繰り返しになりますが,通常のstyles.xmlでは色の指定は1つに限定されてしまいますが,一部のTextViewなどにおいて別の色を指定したいときは,どのように設定することでダークモードのオン・オフに対応したtextColorを設定することができますか.

よろしくお願いいたします.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

attrs.xmlの追加で解決しました.

attrs.xmlres/values内に追加します.
このディレクトリはcolors.xmlstrings.xmldimens.xmlなどの,デザインの定義を置いておく場所としての理解でよいと思います.

また,アトリビュート(attr)の使い方は参考サイトを参考にしました.

具体的な内容

1.attrs.xmlの定義

コード

xml

1<!-- attrs.xml --> 2 3<?xml version="1.0" encoding="utf-8"?> 4<resources> 5 <!-- nameは任意の名前で良いです --> 6 <attr name="attr_txt_label" format="color" /> 7</resources>

解説

このattrはプログラムでいうならば,「変数」としての理解でよいです.
この場合,変数名がattr_txt_labelで,型がcolorです.

2.activity_main.xml内の対象TextViewの変更

コード

xml

1<!-- activity_main.xml --> 2 3<!-- 通常のTextView --> 4<TextView 5 ... /> 6 7<!-- 文字色を変更したいTextView --> 8<TextView 9 ... 10 android:textColor="?attr/attr_txt_label" 11 ... />

解説

ここでは対象のTextViewtextColorattr_txt_label(変数)を指定することで任意の色に変えることを可能にしています.

3.styles.xmlの変更

コード

xml

1<!-- styles.xml --> 2 3<!-- ダークモード(オフ) --> 4<style name="WhiteTheme" parent="Theme.AppCompat.Light"> 5 ... 6 <item name="android:textColor">@color/blackColor</item> 7 <item name="attr_txt_label">@color/whiteColor</item> 8 ... 9</style> 10 11<!-- ダークモード(オン) --> 12<style name="DarkTheme" parent="Theme.AppCompat"> 13 ... 14 <item name="android:textColor">@color/whiteColor</item> 15 <item name="attr_txt_label">@color/blackColor</item> 16 ... 17</style>

解説

それぞれのテーマにおいて,attrs.xmlで定義したattr_txt_labelの変数に対して具体的に色を代入しています.
このようにすることで,テーマに沿った自分なりの色を任意に指定できることになります.

もちろん,このattrtextColorに限らず,あらゆる場面で変数として機能します.
今回は色(formatcolor)のみですが,その他にもintbooleanもあるみたいです.

投稿2020/08/23 01:22

aheshiyu

総合スコア13

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問