setBackground vs setBackgroundDrawable (Android)


258

뷰의 배경 드로어 블을 설정하고 싶습니다. 이이 두 가지 방법은 (내가 볼까지로)입니다 : setBackground와 setBackgroundDrawable.

을 사용할 때 API 레벨 16setBackground 에 추가 되었지만 프로젝트의 최소 SDK 버전은 7이라고 말합니다. 16 미만의 아무것도 작동하지 않는다고 가정합니다. 그러나 setBackgroundDrawable을 사용하면 더 이상 사용되지 않습니다.

무엇을 사용해야합니까?


사용 : image.setImageResource (R.drawable.icon_dot1);
— 용감한

답변:


403

더 이상 사용되지 않지만 여전히 작동하므로 사용할 수 있습니다. 그러나 당신이 완전하게 정확하기를 원한다면, 그 완전성을 위해 ... 다음과 같은 것을 할 것입니다 :

int sdk = android.os.Build.VERSION.SDK_INT;
if(sdk < android.os.Build.VERSION_CODES.JELLY_BEAN) {
    setBackgroundDrawable();
} else {
    setBackground();
}

이것이 작동하려면 buildTarget api 16 및 min build를 7 또는 이와 유사한 것으로 설정해야합니다.


4
setBackgroundDrawable이 더 이상 사용되지 않는다고 여전히 불평합니다. Google이 메소드 이름을 변경하려고했기 때문에 경고를 억제해야합니까?
— Charlie-Blake

2
@ santirivera92 그렇습니다. 또는 문제가 발생하기 전과 후에 1 개의 타겟팅으로 2 개의 프로젝트를 만들 수 있습니다. 쉬운 옵션처럼 들립니까? (실제로 ICS의 많은 수정 사항이 있습니다.)
— Warpzit

4
나는 설정 android:minSdkVersion="7" android:targetSdkVersion="17": () 오류로 나온다 그러나, setBackground의 전화는 API 레벨 16 (현재 분 7)가 필요합니다
— 조니

20
컴파일하지 못했습니다. 문제가있는 코드를 자체 기능에 넣고이 기능에 대해서만 보풀을 비활성화했습니다. @TargetApi(Build.VERSION_CODES.JELLY_BEAN) @SuppressWarnings("deprecation") private static void setBg(RelativeLayout layout, BitmapDrawable TileMe) { if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN) { layout.setBackgroundDrawable(TileMe); } else { layout.setBackground(TileMe); } }
— Jonny

2
@Snicolas 예, IDE 또는 Android는 이러한 종류의 논리를 수행 할 수 있어야합니다.
— Warpzit

111

setBackgroundResource()API 레벨 1에있는 대신 사용할 수 있습니다 .


78
...하지만 당신이 만든 커스텀 드로어 블 클래스가 아닌 리소스 ID를 가진 경우에만!
— Zordid

참조가있는 드로어 블의 ID를 검색하는 방법이 없습니까?
— Poutrathor

2
setBackgroundResource ()는 setBackgroundDrawable ()의 대안이 아닙니다. 또는 setBackground () ;. 전혀 관련이 없습니다. 첫 번째 리소스 드로어 블을 추가하고 다른 하나는 CUSTOM 드로어 블을 추가합니다.
— MBH

목록보기에서 배경을 반복적으로 설정 해야하는 경우 어떻게해야합니까? setBackgroundResource(int)리소스 ID를 허용하므로 배경을 설정하기 위해 매번 뷰를 팽창시켜야합니다. Drawable이 이미 팽창했다고 가정하면 이러한 동작을 원하지 않습니다. 뭔가 빠졌습니까?
— azizbekian

드로어 블 만 가지고 있다면 어떨까요?!
— MBH

55

소스 코드 ( 이 게시물에 대한 신용) 에 표시된 것처럼 현재 두 기능 사이에 차이가없는 것 같습니다 .

public void setBackground(Drawable background) {
    //noinspection deprecation
    setBackgroundDrawable(background);
}

@Deprecated
public void setBackgroundDrawable(Drawable background) { ... }

fill-parent vs match-parent와 비슷한 이름 결정입니다.


5
큰! 감사. 함수 이름 바꾸기로 인해 절름발이 경고가 생성됩니다.
— 누군가 어딘가에

1
@ M.kazemAkhgary 이름 변경을 위해서만 사용되지 않는 것은 아닙니다. 레이아웃 매개 변수 값에 대해 "fill_parent"가 "match_parent"로 변경되었습니다. 둘 다 동일한 값을 가리키는 정확히 같은 것입니다 ..
— 안드로이드 개발자

18

나는 이것이 오래된 질문이라는 것을 알고 있지만 비슷한 상황이 있으며 내 해결책은

button.setBackgroundResource( R.drawable.ic_button );
Drawable d = button.getBackground();

그런 다음 "Drawable"을 사용하여 컬러 필터를 적용 할 수 있습니다.


6
원본 이미지가 리소스에서 나오는 경우에만 작동합니다.
— Matt Huggins 2016 년

이것은 OP의 질문에 대답조차하지 않습니다.
— Petro


12

setBackgroundResource()대신 사용할 수 있습니다.relativeLayout.setBackgroundResource(R.drawable.back);

이것은 나를 위해 작동합니다.


7

이제 이러한 옵션 중 하나를 사용할 수 있습니다. 그리고 어떤 경우에도 작동합니다. 색상은 다음 과 같이 16 진수 코드 가 될 수 있습니다 .

myView.setBackgroundResource(ContextCompat.getColor(context, Color.parseColor("#FFFFFF")));

다음 과 같은 색상 리소스 :

myView.setBackgroundResource(ContextCompat.getColor(context,R.color.blue_background));

또는 다음 과 같이 사용자 정의 xml 자원

myView.setBackgroundResource(R.drawable.my_custom_background);

그것이 도움이되기를 바랍니다!


6

Android Studio 1.5.1을 사용하면 다음 경고가 표시됩니다.

Call requires API level 16 (current min is 9): android.view.View#setBackground

지원 중단에 대한 불만

'setBackgroundDrawable(android.graphics.drawable.Drawable)' is deprecated

이 형식을 사용하여 두 가지를 모두 제거했습니다.

    if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN) {
        //noinspection deprecation
        layout.setBackgroundDrawable(drawable);
    } else {
        layout.setBackground(drawable);
    }

1

이것은 나를 위해 작동합니다 : 보기보기 는 editText, 스피너 ... 등입니다. 그리고 int drawable 은 drawable route 예제입니다 (R.drawable.yourDrawable)

 public void verifyDrawable (View view, int drawable){

        int sdk = Build.VERSION.SDK_INT;

        if(sdk < Build.VERSION_CODES.JELLY_BEAN) {
            view.setBackgroundDrawable(
                    ContextCompat.getDrawable(getContext(),drawable));
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
            view.setBackground(getResources().getDrawable(drawable));
        }    
    }


-2

또한이 문제가 있었지만 ImageView 사용하여 해결 방법을 만들었습니다 .

RelativeLayout을 사용하고 그 안에 ImageView를 추가하십시오 (너비 및 높이 : fill_parent, scaleType : center).

또한 imageview가 RelativeLayout 내부의 첫 번째 요소 인지 확인하여 배경으로 작동합니다.


1
실제로는 if절 이상이어야합니다 . 정답을보십시오.
— Pijusn

-4

당신은 또한 이것을 할 수 있습니다 :

try {
     myView.getClass().getMethod(android.os.Build.VERSION.SDK_INT >= 16 ? "setBackground" : "setBackgroundDrawable", Drawable.class).invoke(myView, myBackgroundDrawable);
} catch (Exception ex) {
     // do nothing
}

편집 : @ BlazejCzapp에서 지적한 것처럼 문제없이 해결할 수 있다면 리플렉션 사용을 피하는 것이 좋습니다. 나는 성찰없이 해결할 수 없었던 유스 케이스를 가지고 있었지만 위의 경우는 아닙니다. 자세한 내용은 http://docs.oracle.com/javase/tutorial/reflect/index.html 을 참조하십시오.


4
@BlazejCzapp LOL이지만 질문에 대답하기 때문에 설명없이 하향 투표해서는 안됩니다. 자녀에게 왜 그렇게할지 말하지 않고 무언가를하지 말라고 말할 때;)
— Fabricio

11
주제를 다루고 싶지는 않지만 몇 가지 이유가 있습니다. 1. Java는 정적으로 유형이 지정된 언어입니다.-컴파일러를 사용하십시오. 2. 이것은 변장의 if 문일뿐입니다 (진실한 논리를 난독 화합니다). 3. 모기를 죽이는 대포를 발사합니다.이 코드는 사소한 문제를 해결하기 위해 심각한 포병을 사용하고 있습니다. 희망이 어느 정도 정당화를
— 투입 Blažej Czapp

감사합니다 @BlazejCzapp, 당신 말이 맞습니다. 위의 코드와 같은 작업을 수행 해야하는 유스 케이스가 있었지만 이것을 처리하는 적절한 방법이 있다면 사용해서는 안됩니다.
— Fabricio

2
이것은 바보입니다 ... 이것을 달성하기 위해 반사를 사용할 이유가 전혀 없습니다.
— Alex Lockwood

네, 간단한 질문을 한 사람에게 "무엇을 사용해야합니까?" 런타임 수정을 시작하십시오.
— Petro
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.