setCompoundDrawables ()를 호출하면 Compound Drawable이 표시되지 않습니다


322

setCompoundDrawables메서드를 호출 한 후 , Drawable 복합은 표시되지 않습니다.

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

이견있는 사람?


9
아래 답변에 명시된 바와 같이, 명명 된 메소드의 변형을 (..)WithIntrinsicBounds호출해야합니다. 참고로, padding컴파운드 드로어 블은 이 호출 효과를 발생시키기 위해 설정되어야합니다.
Dr1Ku

6
문서는 말한다 : 드로어 블 Drawable이 이미 있었음에 틀림 setBounds(Rect)했다.

안녕하세요 hunterp, 방금 커피 숍 (Angel)에서 당신을 만났습니다. 이제 Android Drawables가 무엇인지 알고 있습니다. 내가 공동 작업 한 프로젝트 가이 문제를 해결해야 했기 때문에 Picasso ( github.com/square/picasso )에서 사용하는 github.com/JakeWharton/DiskLruCache (더 안드로이드 친화적으로 만들기 위해 협력했습니다)를 확인하십시오
Gubatron

@ Dr1Ku 실제로 나는 그것을 가지고 있고 어쨌든 작동합니다.
Sotti

답변:


629

을 사용해야했습니다 setCompoundDrawablesWithIntrinsicBounds.


7
api 17이 필요하므로 Drawable.setBounds ()가 더 나을 수 있습니다
user1324936

6
대단히 감사합니다 .. 이것은 나를 위해 작동합니다 ..이 두 가지의 차이점을 알 수 있습니까?
AndEngine

1
@ user1324936 '상대'버전에는 API 17이 필요하며 다른 버전은 이전 버전과 함께 사용할 수 있습니다.
milosmns

11
@ user1324936의 setCompoundDrawablesWithIntrinsicBounds이 추가 된 API 레벨 3
그렉 에니스

나는 setCompoundDrawableRelativeWithIntrinsicBounds <를 사용하고 있었다. 이것은 API 17에 추가되었다. intellisense에주의하라.
Neon Warge

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#setCompoundDrawablesWithIntrinsicBoundsAPI 17 이상이 필요하므로 17 미만의 API를 타겟팅 할 때 유용 합니다.
Krøllebølle

6
그것에 대한 소스를 제공 할 수 있습니까? 내가 본 모든 문서는 API 1부터 사용할 수 있음을 나타냅니다 .
kurifu

48

지정된 범위가 없기 때문에 이미지가 비어 있습니다. 사용할 수는 setCompoundDrawables()있지만 Drawable.setBounds()방법을 사용하여 이미지의 경계를 지정하기 전에


1
실제로 setBounds가 중요한 이유에 대한 추론을 제공하기 때문에 가장 좋은 대답입니다.
Andy

@ 앤디 정확히, 아무 단어없이 하나의 코드 라인을 붙여 넣은 800 투표로 이러한 최고의 답변을 싫어
Big_Chair

44

상단으로 설정된 예 :

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

인수 순서 : (왼쪽, 위, 오른쪽, 아래)


1
내 경우에는 버튼을 사용하여 허용되는 답변이어야합니다. 그리고 그것은 예상대로 작동했습니다! 또한 이전 버전과의 호환성입니다.
mochadwi

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

코 틀린의 예 :

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

0

경계를 지정하지 않았으므로 이미지가 표시되지 않으므로 여기에 두 가지 옵션이 있습니다.

첫 번째 방법

setCompoundDrawablesWithIntrinsicBounds아래와 같이 사용 방법

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

두 번째 방법

아래와 같이 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.