52942
こんにちは、androidアプリを開発しているのですが、ボタンが押されたら、colors.xmlの中身かstyle.xmlの方で定義しているcolorPrimaryDarkとwindowBackgroundを同時に変更させたいのですが、どのような関数でsetできますか？もしくは、どのような方法で変更できますか？助力をください！（その時、見ているページだけではなく、全てのページを変えたいです。）
CC BY-SA 4.0
2019-02-19T09:01:16.497
52874
2019-02-25T09:30:26.133
32240
question
android android-studio
android studioでcolorを動的に変更する
xmlで静的に定義している値は直接変えることが出来ません。この場合、変えたい色を別に定義しておき、それぞれを置き換える必要があります。  
ご質問の内容から、恐らくはアプリへのカラーテーマの適用を行いたいのかなと思うのですが、そのような場合は例えば設定用のActivity等でユーザーの入力による設定値をプリファレンスなどに保存しておき、カラーテーマが必要な部分でプリファレンスから読み込んで一括変更すると楽です。  
ユーザー設定カラーを取得するユーティリティクラスを作ると楽でしょう。  
細かい部分は省略しますが、

context = Context  
res = Resources  
res_id = リソースID（ユーザー設定値でここをswitchして変えます）  
として、

context.getDrawable(res_id);  
または  
res.getColor(res_id);

で取得できる値を返すメソッドを作り各要素に適用すると良いと思います。

追記：  
リアルタイムで変化させたいということでしたので、その場合は上記の変更後リソースIDの取得と保存をカラー変更ボタンを押したタイミングにして、AndroidのプロパティアニメーションAPI（<https://developer.android.com/guide/topics/graphics/prop-
animation.html>）を適用すると良いでしょう。

複数のやり方がありますが、代表的には以下のようなものがあります。

１．直接カラーをアニメーションで変更する方法。（ボタンなどの場合は、アニメーションが終わったタイミングで背景をタップに反応するDrawableに変更する等の追加作業が必要な場合がある）

２．カラー変更後のビューの上に元の色のビューを重ねた状態に置き換え、アニメーションで元の色のビューの透過度を変化（徐々に透明にする）させて色を変更する方法。こちらでは、２つのビューのイメージが混ざりつつ変化します。
CC BY-SA 4.0
2019-02-22T09:17:20.380
52942
2019-02-25T09:30:26.133
2019-02-25T09:30:26.133
8795
8795
52874
answer