setBackground vs setBackgroundDrawable (Android)


258

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

을 사용할 때 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.