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

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

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

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

デザイン

プログラミングでのデザインとは、プログラムの構成や、使用の信頼性・持続性・正確性・利便性の目標達成にはどうするのがベストなのか特定の選択を行うことです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

2回答

3296閲覧

RippleEffectの有無を動的に切り替えたい

type23

総合スコア18

Java

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

デザイン

プログラミングでのデザインとは、プログラムの構成や、使用の信頼性・持続性・正確性・利便性の目標達成にはどうするのがベストなのか特定の選択を行うことです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2017/04/14 11:11

###前提・実現したいこと
RippleEffectの有無を動的に差し替えたいです。
xmlで以下の様に指定した場合は想定通りRippleEffectは表示されます。
このRippleEffectを動的にON/OFFを切り替えたいのですが、プログラム側で差し替えようとしたところ、例外が発生しました。
RippleEffectの有無を動的に切り替えるにはどのようにすれば良いのでしょうか?

また、xmlで指定した時の先頭の?マークの意味を理解できていないので、こちらが原因なのかとも思ったのですが、解決策を見つけることが出来ませんでした。
この先頭の?の意味も教えて頂けると助かります。

xml

1 <TextView 2 android:id="@+id/player_name" 3 android:layout_width="0dp" 4 android:layout_height="wrap_content" 5 android:layout_weight="1" 6 android:background="?android:attr/selectableItemBackground" 7 android:padding="@dimen/dp_l" 8 android:text="@string/default_player_name" 9 android:textColor="@color/link_text" />

###発生している問題・エラーメッセージ

E/AndroidRuntime: FATAL EXCEPTION: main Process: com.type23.exp, PID: 2453 android.content.res.Resources$NotFoundException: Resource ID #0x101030e at android.content.res.Resources.getValue(Resources.java:1274) at android.content.res.Resources.getDrawable(Resources.java:797) at android.content.Context.getDrawable(Context.java:402) at android.support.v4.content.ContextCompatApi21.getDrawable(ContextCompatApi21.java:30) at android.support.v4.content.ContextCompat.getDrawable(ContextCompat.java:372) 以下(略)

###該当のソースコード

kotlin

1nameView.background = ContextCompat.getDrawable(applicationContext, android.R.attr.selectableItemBackground)

###補足情報(言語/FW/ツール等のバージョンなど)

  • android 5.0.1の実機で確認
  • Kotlin(1.1.1)

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

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

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

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

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

guest

回答2

0

自己解決

自己解決しました。
applicationContextを使うのではなく、対象となるTextViewcontextを使うことで、想定通りの動作になりました。

kotlin

1// コレは駄目 2// val context = applicationContext 3// こっちを使う 4val context = nameView.context 5 6val outValue = TypedValue() 7context.theme.resolveAttribute(android.R.attr.selectableItemBackground, outValue, true) 8nameView.background = ContextCompat.getDrawable(context, outValue.resourceId) 9

投稿2017/04/14 15:26

type23

総合スコア18

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

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

0

すみません。訂正です。
実際は例外が発生しなくなっただけで、RippleEffectの(OFFはbackgroundをnullに設定で出来ましたが、)切替が出来ていませんでした。
引き続き回答をお待ちしています。

?で始まるものは各テーマのattributeを取得するために記述する。という事がわかりました。
なので、テーマからattributeを解決する方法が見つかり、以下のコードで期待する動作が出来ました。
正解かどうかが分かっていないので、ご指摘があればおねがいします。

kotlin

1val outValue = TypedValue() 2applicationContext.theme.resolveAttribute(android.R.attr.selectableItemBackground, outValue, true) 3nameView.background = ContextCompat.getDrawable(applicationContext, outValue.resourceId)

投稿2017/04/14 12:29

編集2017/04/14 12:52
type23

総合スコア18

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

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

type23

2017/04/14 12:49 編集

上記、自己回答も修正しましたが、期待する動作をすると書きましたが、例外を吐かなかっただけで実際はRippleEffectが効いていませんでした。 引き続き回答を募集いたしますので、よろしくお願いします。
uniko

2017/04/15 14:47 編集

TextViewはclickableがtrue出ない場合はタップ時等にエフェクトは起こりません。 そこは大丈夫でしょうか? もしくはContextCompat.getDrawableでnullが返ってきていたり。 setOnClickListenerをつけていたり等すると自動でtrueになりますが特に何もしていない場合。 動的ならばsetClickableをxml上であればandroid:clickableでセットできます。 Kotlinでのセットの仕方は分からないのですが参考になれば。 なおClickableをつけるとTextViewの背後へタッチを伝播させたい場合は別途対応が必要になります(要はButton等と同じ扱いになる)。 また内容をみるとセットしたtextColorにもよりますが、変更する背景(リップル)が同じであればsetEnableで無効、有効を切替させるだけリップルを切替る方法もあります。
type23

2017/04/17 01:39 編集

ありがとうございます。 質問当時ミニマムのサンプルコードを作る余裕が無かったので、抜粋にになってしまいかなり乱筆な質問でした。 clickableの件に関しては把握していました。 解決した方法にも記述しましたが、Activity#getApplicationContext()ではなく、エフェクトを付けたいViewのcontextを使用することで解決しました。 ただ、setEnableの方が遥かにわかりやすいので、教えて頂いた方法に変更していきたいと思います。
uniko

2017/04/17 02:28

解決した回答に記載されてましたね。。 解決はしたけど引き続き募集と言う事でまだ問題が起きてるかなと勘違いでコメしてしまいました。 失礼しました。 setEnableについては参考になったようでよかったです。
type23

2017/04/17 06:16

すみません。 質問から自己解決までの流れがわかりにくく、最初の自己解決をしっかり閉じてなかったので誤解を与えるようになってしまってました。 余計な手間をかけさせてしまい、すみません。 ただお陰で(?)setEnableに関しては本当に助かりました。 自己解決のコードだとメンテしにくいだろうな。と思ってました。 >なおClickableをつけるとTextViewの背後へタッチを伝播させたい場合は別途対応が必要になります(要はButton等と同じ扱いになる)。 これに関してもハマりました。 今回のレイアウト的には何とか回避出来たなと思いましたが、この問題に直面したときは、コメント頂いた内容をしっかり調べないと行けないと感じました。
uniko

2017/04/17 09:34 編集

>なおClickableをつけるとTextViewの背後へタッチを伝播させたい場合は別途対応が必要になります(要はButton等と同じ扱いになる)。 これはあれですねTextViewでというよりView全般のお話でして、例えば親のレイアウトでスワイプした場合に何かする等していた場合にClickableなViewの上でスワイプしても伝播されず何も起きなくなると言うようなお話ですね。 わかりずらいかもしれませんので、ちょいと検索したら例を踏まえて解説していたブログがあったのでリンク記載しておきます。 http://blog.lciel.jp/blog/2013/12/03/android-touch-event/
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問