setCompoundDrawables()を呼び出しても複合ドローアブルは表示されません


323

setCompoundDrawablesメソッドを呼び出した後、複合Drawableが表示されません。

Drawable myDrawable = getResources().getDrawable(R.drawable.btn);
btn.setCompoundDrawables(myDrawable, null, null, null);

何かご意見は?


9
以下の回答で述べられているように、指定されたメソッドのバリアントを(..)WithIntrinsicBounds呼び出す必要があります。サイドノートでは、padding化合物のためのDrawableのは、設定する必要があります後に効果が発生し、このコール
Dr1Ku

6
文書は言う:ドローアブルが既に持っている必要がありますsetBounds(Rect)と呼ばれます。

こんにちはhunterpです。コーヒーショップ(Angel)でお会いしました。AndroidDrawableが何であるかを知っている(そして、それらの多くで作業しているときに、おそらくエラーエラーでメモリ不足に陥った)ので、私が協力したプロジェクトはこの問題に対処する必要がありました。ピカソ(github.com/square/picasso)で使用されているgithub.com/JakeWharton/DiskLruCache(私が協力してよりAndroidフレンドリーにするため)を確認してください
Gubatron

@ Dr1Ku実際に私は以前にそれを持っていて、とにかく動作しています。
ソッティ2014年

回答:


629

を使用する必要がありましたsetCompoundDrawablesWithIntrinsicBounds


7
api 17が必要なので、
Drawable.setBounds

6
どうもありがとう..これは私のために働く..私はこれらの2つの違いを知っていますか?
AndEngine

1
@ user1324936「相対」バージョンにはAPI 17が必要で、その他は以前のバージョンで使用できます
milosmns

11
@ user1324936 setCompoundDrawablesWithIntrinsicBoundsがAPIレベル3
グレッグエニス

私はsetCompoundDrawableRelativeWithIntrinsicBoundsを使用していました<-これはAPI 17で追加されました。インテリセンスに注意してください。
ネオンワージ16

69

これを使用(私はテストしました)。それはうまくいきます

Drawable image = context.getResources().getDrawable( R.drawable.ic_action );
int h = image.getIntrinsicHeight(); 
int w = image.getIntrinsicWidth();   
image.setBounds( 0, 0, w, h );
button.setCompoundDrawables( image, null, null, null );

1
EditText#setCompoundDrawablesWithIntrinsicBounds少なくともAPI 17が必要なため、これは17未満のAPIを対象とする場合に役立ちます。
Krøllebølle16年

6
そのソースを提供できますか?私が見たすべてのドキュメントは、これがAPI 1から利用可能であることを示しています
2016年

48

指定された境界がないため、画像は空白です。あなたは使用できますsetCompoundDrawables()が、Drawable.setBounds()メソッドを使用して画像の境界を指定する前に


1
あなたが実際にsetBoundsが重要である理由についての推論を実際に提供するため、最良の回答です。
アンディ

@Andy正確に、これらの上位の回答を800票で嫌いにして、1行のコード行を何も入力せずにコピーして貼り付けました
Big_Chair

44

先頭に設定した例:

view.setCompoundDrawablesWithIntrinsicBounds(
    null,
    getResources().getDrawable(R.drawable.some_img),
    null,
    null
);

引数の順序:(左、上、右、下)


1
これは、私の場合はボタンを使用した場合の受け入れられる答えです。そしてそれは期待通りに機能しました!!! また、下位互換性もあります。
モチャドイ

22

もう少し簡単に:

Drawable image = context.getResources().getDrawable(R.drawable.ic_action );
image.setBounds( 0, 0, image.getIntrinsicWidth(), image.getIntrinsicHeight() );
button.setCompoundDrawables( image, null, null, null );

10

API 22では非推奨です。

このコードは私にとって便利です:

Drawable drawable = ResourcesCompat.getDrawable(getResources(),R.drawable.wen, null);
drawable.setBounds(0, 0, drawable.getMinimumWidth(),
drawable.getMinimumHeight());
tv.setCompoundDrawables(drawable, null, null, null);

3

コトリンでは:

1)セットdrawable

val drawable = ContextCompat.getDrawable(context!!,R.drawable.ic_image)?.apply {
    setBounds(0, 0, intrinsicWidth, intrinsicHeight)
}

または

val drawable = ResourcesCompat.getDrawable(resources, R.drawable.ic_image, null)?.apply {
    setBounds(0, 0, minimumWidth, minimumHeight)
}

2)セットTextView

textView.setCompoundDrawablesWithIntrinsicBounds(drawable, null, null, null)

または

button.setCompoundDrawables(null, drawable, null, null)

TextViewのためにsetCompoundDrawablesWithIntrinsicBounds働いています...
AkashさんBisariya


1

Kotlinの例:

    val myView = layoutInflater.inflate(R.layout.my_view, null) as TextView
    myView.setCompoundDrawablesWithIntrinsicBounds(0, myDrawable, 0, 0)

0

境界を指定していないため、画像は表示されないため、ここには2つのオプションがあります。

最初の方法

setCompoundDrawablesWithIntrinsicBounds以下に示すような使用方法

Drawable myDrawable = getResources().getDrawable(R.drawable.btn);
btn. setCompoundDrawablesWithIntrinsicBounds(myDrawable, null, null, null);

2番目の方法

以下に示すように、TextViewに適用する前に、ドローアブルに境界を適用できます。

Drawable myDrawable = getResources().getDrawable(R.drawable.btn);
myDrawable.setBounds( 0, 0, myDrawable.getIntrinsicWidth(), myDrawable.getIntrinsicHeight());
btn.setCompoundDrawables(myDrawable, null, null, null);

それでおしまい。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.