Android getResources (). getDrawable () 지원 중단 된 API 22


700

새로운 Android API 22 getResources().getDrawable()에서는 더 이상 사용되지 않습니다. 이제 가장 좋은 방법은을 사용하는 것 getDrawable()입니다.

무엇이 바뀌 었습니까?


질문을 지정할 수 있습니까? getDrawable (int id)클래스 의 메소드 Resources는 더 이상 사용되지 않습니다. 이제 getDrawable (int id, Resources.Theme theme)새로운 테마 매개 변수와 함께 메소드 를 사용해야합니다 .
코드 원숭이

1
ContextCompat.getDrawable (context, R.color.color_name)
Ashokchakravarthi Nagarajan

왜 그리고 더 이상 사용되지 않는지에 대한 자세한 설명을 보려면이 주제에 대한 내 블로그 게시물 을 확인하십시오 . Resources#getDrawable(int)Resources#getColor(int)
Alex Lockwood

1
Google은 더 이상 사용되지 않는 기능마다 빠른 수정을해야합니다. 난 여기에 대한 게시물을 만든 : code.google.com/p/android/issues/detail?id=219495
안드로이드 개발자

답변:


1028

이 중단 권리 (및 처리하기 위해 몇 가지 옵션을 가지고 미래의 증거 ) 방법, 종류 당김의있는로드중인 따라 :


A)는 드로어 블 테마 속성

ContextCompat.getDrawable(getActivity(), R.drawable.name);

활동 테마가 지시하는대로 스타일 드로어 블을 얻을 수 있습니다. 이것은 아마도 당신이 필요로하는 것입니다.


B) 테마 속성이 없는 드로어 블

ResourcesCompat.getDrawable(getResources(), R.drawable.name, null);

스타일이없는 드로어 블을 구식으로 만들 수 있습니다. 참고 : ResourcesCompat.getDrawable()되어 있지 되지 않습니다!


EXTRA)는 드로어 블 테마에서 속성을 다른 테마

ResourcesCompat.getDrawable(getResources(), R.drawable.name, anotherTheme);

제안 B를 사용하여 앱이 충돌합니다. Drawable originalIcon = ResourcesCompat.getDrawable (ctxt.getResources (), iconResId, null);
FractalBob

다음과 같이 선언합니다. public static void setImageButtonEnabled (Context ctxt, boolean enabled, ImageButton item, int iconResId) {item.setEnabled (enabled); Drawable originalIcon = ResourcesCompat.getDrawable (ctxt.getResources (), iconResId, null); 드로어 블 아이콘 = 사용? originalIcon : convertDrawableToGrayScale (originalIcon); item.setImageDrawable (아이콘); } 다음과 같이 호출하십시오. Utility.setImageButtonEnabled (getContext (), false, back, R.drawable.arrow_left);
FractalBob

더 정확하게 말하면 내 아이콘이 벡터 드로어 블이기 때문에 충돌이 발생하는 것 같습니다.
FractalBob

1
xamarin 버전 : ResourcesCompat.GetDrawable (Resources, Resource.Drawable.name, null);
Brian

나는 당신에게 하나 이상의 단어를 추가 , ContextCompat.getColor (context, color) 또한 당신을 도울 수 있습니다 ...
BertKing

746

편집 : 더 자세한 설명은 주제에 대한 내 블로그 게시물 을 참조하십시오


대신 지원 라이브러리에서 다음 코드를 사용해야합니다.

ContextCompat.getDrawable(context, R.drawable.***)

이 메소드를 사용하는 것은 다음을 호출하는 것과 같습니다.

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    return resources.getDrawable(id, context.getTheme());
} else {
    return resources.getDrawable(id);
}

API 21 부터는 지정된 화면 밀도 / 테마에 대한 특정 리소스 ID와 관련된 드로어 블 객체를 가져올 수 있으므로 getDrawable(int, Theme)대신 메소드를 사용해야합니다 getDrawable(int). 사용되지 않는 getDrawable(int)메소드를 호출하는 것은를 호출하는 것과 같습니다 getDrawable(int, null).


8
OP는 클래스 의 getDrawable (int id)방법을 의미한다고 생각합니다 Context. 이것은 getResources().getDrawable(id, getTheme());새로운 API와 동일 하며 또한 사용합니다.
코드 원숭이

9
설명서에 따르면을 사용하려면 최소 API 레벨 21이 필요합니다 getDrawable(int, Resources.Theme).
프린스

@Prince이 메소드는 API 21에 추가되었지만 API 22까지는 더 이상 사용되지 않습니다. :)
Alex Lockwood

안드로이드 문서는 Context :: getDrawable (int) 메소드 사용을 권장 하지만 API 21에서만 도입 되었으므로 ContextCompat가 최선의 선택 인 것 같습니다.
goRGon

이 답변은 API 21 이전 버전의 .svg 파일에서는 작동하지 않습니다. 라이브러리에 버그가 있습니다.
Jorge Rodríguez

141

이 줄을 바꾸십시오 : getResources().getDrawable(R.drawable.your_drawable)

ResourcesCompat.getDrawable(getResources(), R.drawable.your_drawable, null)

편집하다

ResourcesCompat더 이상 사용되지 않습니다. 그러나 이것을 사용할 수 있습니다 :

ContextCompat.getDrawable(this, R.drawable.your_drawable)(여기 this상황)

자세한 내용은 다음 링크를 참조하십시오. ContextCompat


2
: 그게 지금은 너무 depricated plus.google.com/+BenjaminWeiss/posts/M1dYFaobyBM
Xyaren


2
이 글은 말을하지 않는 링크ResourcesCompat 되지 않습니다. 잘 작동합니다.
Jacob R

드로어 블에 저장된 목록 항목을 클릭 할 때 목록보기에 이미지를 입력하려면 "드로어 블"에 기록 할 내용
0x0001

29

getResources().getDrawable() API 레벨 22에서 더 이상 사용되지 않습니다. 이제 테마를 추가해야합니다.

getDrawable (int id, Resources.Theme 테마) (API 레벨 21에 추가됨)

이것은 예입니다 :

myImgView.setImageDrawable(getResources().getDrawable(R.drawable.myimage, getApplicationContext().getTheme()));

다음은 이후 버전의 유효성을 검사하는 방법의 예입니다.

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { //>= API 21
     myImgView.setImageDrawable(getResources().getDrawable(R.drawable.myimage, getApplicationContext().getTheme()));
   } else { 
     myImgView.setImageDrawable(getResources().getDrawable(R.drawable.myimage));
}

Build.VERSION_CODES.LOLLIPOP is API 21그래서이 안 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1)if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP)? 신경 쓰지 마. 아래에서 "이 방법은 API 21에 추가되었지만 API 22까지는 더 이상 사용되지 않습니다. :)"
Mark Cramer

2

당신이 사용할 수있는

ContextCompat.getDrawable(getApplicationContext(),R.drawable.example);

그게 나를 위해 일해


응용 프로그램 컨텍스트를 사용하여 사전 롤리팝에서 벡터 드로어 블 충돌을로드합니다. 이것에 대한 어떤 수정?
muthuraj

1
@muthuraj 롤리팝 케이스가있는 코드 테스트를 기억하지 않지만 getActivity () 또는 getResources () 대신 코드를 사용할 수 있습니까?
Dasser Basyouni

MVVM 패턴을 사용하고 있으며 활동 컨텍스트가없는 ViewModels 안에 드로어 블을 팽창시켜야합니다. 응용 프로그램 컨텍스트 만 있습니다. 그것이 내 문제입니다.
muthuraj

1

listView를로드하기 위해 배열에서 문제를 해결 한 방법의 예만 있으면 도움이되기를 바랍니다.

 mItems = new ArrayList<ListViewItem>();
//    Resources resources = getResources();

//    mItems.add(new ListViewItem(resources.getDrawable(R.drawable.az_lgo), getString(R.string.st_az), getString(R.string.all_nums)));
//    mItems.add(new ListViewItem(resources.getDrawable(R.drawable.ca_lgo), getString(R.string.st_ca), getString(R.string.all_nums)));
//    mItems.add(new ListViewItem(resources.getDrawable(R.drawable.co_lgo), getString(R.string.st_co), getString(R.string.all_nums)));
    mItems.add(new ListViewItem(ResourcesCompat.getDrawable(getResources(), R.drawable.az_lgo, null), getString(R.string.st_az), getString(R.string.all_nums)));
    mItems.add(new ListViewItem(ResourcesCompat.getDrawable(getResources(), R.drawable.ca_lgo, null), getString(R.string.st_ca), getString(R.string.all_nums)));
    mItems.add(new ListViewItem(ResourcesCompat.getDrawable(getResources(), R.drawable.co_lgo, null), getString(R.string.st_co), getString(R.string.all_nums)));

1

이 시도:

public static List<ProductActivity> getCatalog(Resources res){
    if(catalog == null) {
        catalog.add(new Product("Dead or Alive", res
                .getDrawable(R.drawable.product_salmon),
                "Dead or Alive by Tom Clancy with Grant Blackwood", 29.99));
        catalog.add(new Product("Switch", res
                .getDrawable(R.drawable.switchbook),
                "Switch by Chip Heath and Dan Heath", 24.99));
        catalog.add(new Product("Watchmen", res
                .getDrawable(R.drawable.watchmen),
                "Watchmen by Alan Moore and Dave Gibbons", 14.99));
    }
}

이 코드는 질문에 대답 할 수 있지만,이 코드가 질문에 응답하는 이유 및 / 또는 방법에 대한 추가 컨텍스트를 제공하면 장기적인 가치가 향상됩니다.
Donald Duck


1

getDrawable (int drawable) 은 API 레벨 22에서 더 이상 사용되지 않습니다 . 참조를 위해이 링크 를 참조하십시오 .

이제이 문제를 해결하려면 다음과 같이 id와 함께 새로운 생성자를 전달해야합니다.

getDrawable(int id, Resources.Theme theme)

솔루션의 경우 다음과 같이하십시오 :-

자바에서 :-

ContextCompat.getDrawable(getActivity(), R.drawable.name);   

또는

 imgProfile.setImageDrawable(getResources().getDrawable(R.drawable.img_prof, getApplicationContext().getTheme()));

코 틀린에서 :-

rel_week.background=ContextCompat.getDrawable(this.requireContext(), R.color.colorWhite)

또는

 rel_day.background=resources.getDrawable(R.drawable.ic_home, context?.theme)

이것이 도움이되기를 바랍니다. 감사합니다.


getDrawable (DrawableRes int id, Theme 테마)은 리소스를 찾지 못하고 getDrawable (Context context, int id)가 nullable 인 경우 예외를 발생시킬 수 있으므로 Drawable로 반환해야한다고 언급 할 가치가 있습니다. 코 틀린에서.
피토


0

이제 이런 식으로 구현해야합니다

  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { //>= API 21
        //
    } else {
        //
    }

한 줄의 코드로 충분하면 모든 것이 ContextCompat.getDrawable에 의해 처리됩니다.

ContextCompat.getDrawable(this, R.drawable.your_drawable_file)

0

이 스레드의 제안을 적용한 후에도 여전히이 문제를 해결하려는 일부 사람들은 (이전과 같았습니다) Application 클래스에 onCreate () 메소드 에이 줄을 추가하십시오

AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)

여기여기에 제안 된 것처럼 때로는 메뉴 항목 등을 다룰 때 특히 리소스의 벡터에 액세스해야합니다.


0

Kotlin에서는 확장 기능을 사용할 수 있습니다

fun Context.getMyDrawable(id : Int) : Drawable?{

    return  ContextCompat.getDrawable(this, id)
}

그런 다음 사용

context.getMyDrawable(R.drawable.my_icon)

-2

Build.VERSION_CODES.LOLLIPOP가 이제 BuildVersionCodes.Lollipop으로 변경되어야합니다.

if (Build.VERSION.SdkInt >= BuildVersionCodes.Lollipop) {
    this.Control.Background = this.Resources.GetDrawable(Resource.Drawable.AddBorder, Context.Theme);
} else {
    this.Control.Background = this.Resources.GetDrawable(Resource.Drawable.AddBorder);
}

하지인가 BuildVersionCodes자 마린에 클래스 별?
Ted Hopp
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.