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

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

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

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

Android Studio

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

Q&A

解決済

2回答

3813閲覧

getDrawable()の扱い

hood

総合スコア351

Java

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

Android Studio

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

0グッド

0クリップ

投稿2018/07/26 15:03

編集2018/07/26 15:55

###getDrawable()の扱い
私は画像表示の方法として、String.xmlにR.drawableの名前を指定し、それをactivityで動的に取得するという方式をとっています。そしてそれは実際に上手くいっています。
以下はその簡略したコードです

lang

1ImageView base= (ImageView) findViewById(R.id.base); 2//numberが変化する。Strings.xmlから動的にIdを取得。 3int baseId = getResources().getIdentifier("base" + number, "string", getPackageName()); 4base.setImageResource(baseId);

lang

1<string name="base1">@drawable/taro_base</string> 2<string name="base2">@drawable/hanako_base</string> 3<string name="base3">@drawable/taro_base</string> 4・・・・

ここからが本題で、実はある事情により、javaコードを使って画像を重ねる必要が出てきました。
さてどうしよう思い、LayerDrawableを使うことにしました。
そのさいに参考にしたのがこのサイトです。
具体的に言うと以下の部分です。

lang

1// LayerDrawable の素材となる Drawable を取得 2Resources r = getResources(); 3Drawable shape = r.getDrawable(R.drawable.shape_sample); 4Drawable droid = r.getDrawable(R.drawable.droid); 5 6// LayerDrawable を生成 7Drawable[] layers = { shape, droid }; 8LayerDrawable layerDrawable = new LayerDrawable(layers); 9 10// padding を設定する 11int padding = r.getDimensionPixelSize(R.dimen.padding); 12layerDrawable.setLayerInset(1, padding, padding, padding, padding); 13 14// View にセットする 15ImageView view = (ImageView) findViewById(R.id.image_view); 16view.setImageDrawable(layerDrawable);

これにならってコードを書きました。しかしアプリは止ってしまいました。
デバックしてみるとどうやらgetDrawable(baseId)のところでエラーが起きているようです。
以下にそのコードを記します。
(重ねる画像について、全てのコードを書くと冗長になるので、適宜略しています)

lang

1ImageView base= (ImageView) findViewById(R.id.base); 2略ーー 3int baseId = getResources().getIdentifier("base" + number, "string", getPackageName()); 4略ーー 5Drawable base=getResources().getDrawable(baseId);//ここで止る 6 7Drawable[] layers = { base, 略}; 8 LayerDrawable layerDrawable = new LayerDrawable(layers); 9 ImageView view = (ImageView) findViewById(R.id.略); 10 view.setImageDrawable(layerDrawable); 11

これはgetDrawable()setImageDrawable()のように、Strings.xmlで取得した文字列のIDを持ってくることができないということなのでしょうか?
参考にしたサイトにはgetDrawable(R.drawable.shape_sample)とあるのでこの引数にStrings.xmlで取得した文字列のIDを入れてあげればいいと思ったのですが・・・・

だとすればどのように解決できるでしょうか?
どなたかご教授いただけると助かります・・・・!

追記ーーー
調べたところ今はgetDrawable()が非推奨になっているようですね・・・
ですが、Drawable drawable = ResourcesCompat.getDrawable(getResources(), baseId, null);としてもだめでした・・・

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

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

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

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

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

guest

回答2

0

すでにベストアンサーがついちゃったようですが、もっとシンプルに解決するためのアドバイスです。

ご質問の今の方法だと、

  • strings.xml内にdrawableのリソース名を定義している

→ 文字列を取得してそこからIDを取得して、と処理が多くパフォーマンスがよくない
→ そのぶん無駄なリソースが確保されアプリの容量が増える
→ タイポした際に表示できないし気付きづらい

  • そもそもgetIdentifierはあまり効率の良くないメソッドなので使うのは推奨されていない

→ 直接IDで指定できるならなるべくそうすべき
https://developer.android.com/reference/android/content/res/Resources?hl=ja#getIdentifier(java.lang.String,%20java.lang.String,%20java.lang.String)

といくつか無駄な部分があります。

必要なのは番号に対応するdrawableを取得するための方法だと思いますので、以下のように配列で定義してしまってはどうでしょうか?

java

1final int[] baseIds = new int[] { 2 R.drawable.taro_base, 3 R.drawable.hanako_base, 4 R.drawable.taro_base, 5 ... 6}; 7 8// 使うとき 9Drawable base = getResources().getDrawable(baseIds[number]);

投稿2018/07/28 04:30

編集2018/07/28 04:32
kakajika

総合スコア3131

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

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

hood

2018/07/28 06:38

kakajikaさんですね、ご無沙汰しております・・ なるほど・・・そういうやり方があるのですね。 確かに今のやり方だとコードがすごく複雑になって無駄が多いと、気づかされました。 ご指摘、ありがとうございます! もう一度コードをスマートにするため見直してみようと思います!
guest

0

ベストアンサー

Resources#getDrawableメソッドに、文字列リソースIDを渡しているからではないですか。

文字列リソースにドローワブルリソースが書かれているなんて事はgetDrawableメソッドの知る由もない事ですから、自分でResources#getStringメソッドで文字列を読み込んで、Resources#getIdentifierメソッドで更にドローワブルリソースIDに変換する必要があります。

あと、

xml

1<string name="base1">@drawable/taro_base</string>

「@drawable/」は要らないのでは。


Resources#getDrawableメソッドが非推奨なのは、テーマを指定しないメソッドですね。

Resources#getDrawable(int, Theme)や、Context#getDrawableは非推奨ではありません。
要は、~~テーマを指定しろという事です。 ~~nullでもいいからテーマを指定しろという事です。

java

1public class MainActivity extends Acitvity { 2 @Override 3 protected void onCreate(Bundle savedInstanceState) 4 { 5 super.onCreate(savedInstanceState); 6 7 // 非推奨 8 getResources().getDrawable(R.drawable.ic_launcher); 9 // 推奨 10 getResources().getDrawable(R.drawable.ic_launcher, getTheme()); 11 // 推奨 12 getDrawable(R.drawable.ic_launcher); 13}

投稿2018/07/27 00:46

編集2018/07/27 00:50
katsuko

総合スコア3469

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

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

hood

2018/07/27 04:57 編集

katsukoさんですね・・・fragmentに関する質問をしたときもお世話になりました。 今回も回答ありがとうございます。 ご指摘の通り手直ししたら、無事解決しました! Resources#getDrawableメソッドの非推奨される理由なども、教えていただき、勉強になりました。 本当になんどもありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問