리소스에서 Drawable을 만드는 방법


283

이미지가 있습니다 res/drawable/test.png(R.drawable.test). 예
를 들어이 이미지를 허용하는 함수에이 이미지를 전달하고 싶습니다 .DrawablemButton.setCompoundDrawables()

어떻게 이미지 리소스를로 변환 할 수 Drawable있습니까?

답변:


567

활동에는 getResources 메소드가 있어야합니다. 하다:

Drawable myIcon = getResources().getDrawable( R.drawable.icon );

2
Activity 클래스 외부에서 이것을 원한다면 getResources ()가있는 Context에 도달하는 다른 방법을 찾아야합니다. 이 답변은 생성자에 전달하는 것이 좋습니다
rymo

50
API 버전 21부터이 메소드는 더 이상 사용되지 않으며 다음으로 대체해야합니다. Drawable drawable = ResourcesCompat.getDrawable (getResources (), page.getImageId (), null);
Boren

3
@Boren은 ContextCompat.getDrawable (this, R.drawable.icon);을 사용하는 것과 동일합니까?
Zach

2
R.drawable.icon이 Vector drawable 인 경우 위의 제안 중 어느 것도 작동하지 않는 것 같습니다.
FractalBob

4
벡터 그리기 가능을 사용하는 경우에는 사용하지 마십시오. 대신 AppCompatResources.getDrawable (context, R.drawable.icon)을 사용하십시오.
Dhaval Patel

136

이 코드는 더 이상 사용되지 않습니다.

Drawable drawable = getResources().getDrawable( R.drawable.icon );

대신 이것을 사용하십시오 :

Drawable drawable = ContextCompat.getDrawable(getApplicationContext(),R.drawable.icon);

11
주어진 컨텍스트에서 테마가 적용됩니다. 테마가 사용되지 않도록 ResourcesCompat.getDrawable(getResources(), R.drawable.icon, null);하려면 세 번째 매개 변수가 선택적 테마 인스턴스 인 경우를 사용할 수 있습니다 .
vaughandroid

23

getDrawable (int id)방법은 API 22부터 감가 상각됩니다.

대신 getDrawable (int id, Resources.Theme theme)API 21+에 대해

코드는 다음과 같습니다.

Drawable myDrawable;
if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP){
    myDrawable = context.getResources().getDrawable(id, context.getTheme());
} else {
    myDrawable = context.getResources().getDrawable(id);
}

왜 모든 API에 대해 null을 전달하지 않습니까? 플러스 : null이 최선의 선택이라고 확신합니까?
jonathanrz

1
getDrawable (int id, Resources.Theme 테마)은 API 21까지 나오지 않았습니다.
Chris Stillwell

또는getResources().getDrawable(R.drawable.ic_warning_80dp, context?.theme)
Simon Featherstone

13

getDrawable (...)을 사용할 때 "더 이상 사용되지 않음"메시지가 표시되는 경우 지원 라이브러리에서 다음 방법을 대신 사용해야한다고 덧붙이고 싶습니다.

ContextCompat.getDrawable(getContext(),R.drawable.[name])

이 메소드를 사용할 때 getResources ()를 사용할 필요는 없습니다.

이것은 다음과 같은 일을하는 것과 같습니다.

Drawable mDrawable;
if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP){
    mDrawable = ContextCompat.getDrawable(getContext(),R.drawable.[name]);
} else {
    mDrawable = getResources().getDrawable(R.id.[name]);
}

이것은 Lollipop 이전 버전과 이후 버전 모두에서 작동합니다.


4

벡터 여부에 관계없이 벡터 리소스에서 Drawable을 가져옵니다.

AppCompatResources.getDrawable(context, R.drawable.icon);

참고 : 벡터 리소스
ContextCompat.getDrawable(context, R.drawable.icon);를 생성 android.content.res.Resources$NotFoundException합니다.


3

이미지가 설정된 뷰에서 드로어 블을 가져 오려고하면

ivshowing.setBackgroundResource(R.drawable.one);

drawable은 다음 코드와 함께 null 값만 반환합니다 ...

   Drawable drawable = (Drawable) ivshowing.getDrawable();

따라서 특정 뷰에서 드로어 블을 검색하려면 다음 코드로 이미지를 설정하는 것이 좋습니다.

 ivshowing.setImageResource(R.drawable.one);

그래야만 드로어 블이 정확히 변환됩니다.


1

조각에서 상속하는 경우 다음을 수행 할 수 있습니다.

Drawable drawable = getActivity().getDrawable(R.drawable.icon)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.