안드로이드에서 프로그래밍 방식으로 배경 드로어 블을 설정하는 방법


289

배경을 설정하려면

RelativeLayout layout =(RelativeLayout)findViewById(R.id.background);
layout.setBackgroundResource(R.drawable.ready);

가장 좋은 방법입니까?


2
감사합니다! 귀하의 질문과 모든 유용한 답변은 위젯 내부에 이미지 버튼의 배경 리소스를 설정하는 데 도움이되었습니다 . 다음은 누군가 관심이있는 경우를위한 샘플 코드입니다.remoteViews.setInt(R.id.btn_start,"setBackgroundResource", R.drawable.ic_button_start);
Sam

1
코 틀린 솔루션은 누구를 위해해야 할 수도 있습니다 : stackoverflow.com/a/54495750/6247186
하메드 Jaliliani

답변:


490

layout.setBackgroundResource(R.drawable.ready);맞다.
그것을 달성하는 또 다른 방법은 다음을 사용하는 것입니다.

final int sdk = android.os.Build.VERSION.SDK_INT;
if(sdk < android.os.Build.VERSION_CODES.JELLY_BEAN) {
    layout.setBackgroundDrawable(ContextCompat.getDrawable(context, R.drawable.ready) );
} else {
    layout.setBackground(ContextCompat.getDrawable(context, R.drawable.ready));
}

그러나 큰 이미지를로드하려고하기 때문에 문제가 발생한다고 생각합니다.
다음 은 큰 비트 맵을로드하는 방법에 대한 유용한 자습서입니다.

업데이트 :
API 레벨 22에서 사용되지 않는 getDrawable (int)


getDrawable(int ) 가 이제 API 레벨 22에서 사용되지 않습니다. 대신 지원 라이브러리에서 다음 코드를 사용해야합니다.

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

ContextCompat.getDrawable 의 소스 코드를 참조 하면 다음과 같은 내용이 표시됩니다.

/**
 * Return a drawable object associated with a particular resource ID.
 * <p>
 * Starting in {@link android.os.Build.VERSION_CODES#LOLLIPOP}, the returned
 * drawable will be styled for the specified Context's theme.
 *
 * @param id The desired resource identifier, as generated by the aapt tool.
 *            This integer encodes the package, type, and resource entry.
 *            The value 0 is an invalid identifier.
 * @return Drawable An object that can be used to draw this resource.
 */
public static final Drawable getDrawable(Context context, int id) {
    final int version = Build.VERSION.SDK_INT;
    if (version >= 21) {
        return ContextCompatApi21.getDrawable(context, id);
    } else {
        return context.getResources().getDrawable(id);
    }
}

ContextCompat 에 대한 자세한 내용

API 22부터 getDrawable(int, Theme)getDrawable (int) 대신 메소드를 사용해야합니다 .

업데이트 :
지원 v4 라이브러리를 사용하는 경우 다음은 모든 버전에 충분합니다.

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

앱 빌드에 다음을 추가해야합니다.

compile 'com.android.support:support-v4:23.0.0' # or any version above

또는 아래와 같은 API에서 ResourceCompat를 사용하십시오.

import android.support.v4.content.res.ResourcesCompat;
ResourcesCompat.getDrawable(getResources(), R.drawable.name_of_drawable, null);

3
'getDrawable (int)'는 사용되지 않습니다.
S.M_Emamian

이미지 버튼의 배경 이미지가 특정 드로어 블 리소스 인 경우에만 작업을 수행하려고합니다. 어떻게 비교할 수 있습니까 ... 이 오류가 발생하는 if(buttonBackground.equals(R.drawable.myDrawable))부분을 시도했습니다 Drawable buttonBackground = myButton.getBackground();: snag.gy/weYgA.jpg
Ruchir Baronia

myActivity.getTheme()null 매개 변수 대신 최신 버전의 메서드 가 필요 합니다.myView.setBackground( getResources().getDrawable(R.drawable.my_background, activity.getTheme()));
Zon

또는 AppCompatResources.getDrawable(this.getContext(), resId)대신 사용할 수 있습니다 . Google은 이미AppCompat* 위젯 /보기, 예를 들면 :android.support.v7.widget.AppCompatCheckBox
mochadwi

108

이 시도:

layout.setBackground(ContextCompat.getDrawable(context, R.drawable.ready));

API 16 <의 경우 :

layout.setBackgroundDrawable(ContextCompat.getDrawable(context, R.drawable.ready));

2
그러나 이것은 같은 것입니다 Ahmad :)
Mohammad Ersan

4
아 좋아, 나는 게으른 닌자 답변을 참조 할 것입니다.
Ahmad

39
당신은 필요하지 않습니다 getResources().getDrawable(). 올바른 코드는 layout.setBackgroundResource(R.drawable.ready);사용 된 OP와 같습니다. 여기서 문제는 비트 맵의 ​​크기에서 비롯됩니다.
BVB

1
setBackground는 API 레벨 16 이상입니다.
Erwan

17
RelativeLayout relativeLayout;  //declare this globally

이제 onCreate, onResume과 같은 함수 안에서

relativeLayout = new RelativeLayout(this);  
relativeLayout.setBackgroundResource(R.drawable.view); //or whatever your image is
setContentView(relativeLayout); //you might be forgetting this

9

모든 이미지의 배경을 설정할 수도 있습니다.

View v;
Drawable image=(Drawable)getResources().getDrawable(R.drawable.img);
(ImageView)v.setBackground(image);

이건 내 문제를 해결하지만, 내가 구현해야 (.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN)내부를 코드
아르만도 마르케스 Sobrinho

1
이것은 현재 사용되지 않습니다
user7856586

4

minSdkVersion 16 및 targetSdkVersion 23을 사용하고 있습니다.
다음은 나를 위해 작동합니다.

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

사용하는 대신:

layout.setBackgroundResource(R.drawable.ready);

오히려 사용 :

layout.setBackground(ContextCompat.getDrawable(this, R.drawable.ready));

getActivity()액티비티 use에서 호출하는 경우 조각에 사용 this됩니다.


2

배경이 드로어 블 폴더에있는 경우 이미지를 프로젝트의 드로어 블에서 드로어 블-노피 폴더로 이동해보십시오. 이것은 나를 위해 일했습니다. 그렇지 않으면 이미지가 스스로 크기 조정됩니다 ..


5
글쎄, 당신이 HD 품질로 프로젝트에 사용해야하는 이미지의 사본이 없다면 안드로이드가 일반 드로어 블 폴더를 사용하여 크 래피 품질로 크기를 조정하도록하십시오. 심지어 질문이 오래 되어도 Google에 팝업이 표시되면 새로운 것을 게시하는 것보다 괜찮습니다.
Jordy

1

butterknife 를 사용 하여 드로어 블 리소스를 클래스 상단에 (메서드 전에) 추가하여 변수에 바인딩 할 수 있습니다.

@Bind(R.id.some_layout)
RelativeLayout layout;
@BindDrawable(R.drawable.some_drawable)
Drawable background;

그런 다음 메소드 중 하나에

layout.setBackground(background);

그게 당신이 필요한 전부입니다


1
if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN)
     layout.setBackgroundDrawable(getResources().getDrawable(R.drawable.ready));
else if(android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP_MR1)
     layout.setBackground(getResources().getDrawable(R.drawable.ready));
else
     layout.setBackground(ContextCompat.getDrawable(this, R.drawable.ready));


0

이 코드를 사용해보십시오 :

Drawable thumb = ContextCompat.getDrawable(getActivity(), R.mipmap.cir_32);
mSeekBar.setThumb(thumb);

0

이 시도.

 int res = getResources().getIdentifier("you_image", "drawable", "com.my.package");
 preview = (ImageView) findViewById(R.id.preview);
 preview.setBackgroundResource(res);


-1

app / res / your_xml_layout_file .xml 내부

  1. 부모 레이아웃에 이름을 지정하십시오.
  2. mainActivity로 이동하여 findViewById (R.id. "given_name")을 호출하여 RelativeLayout을 찾으십시오.
  3. setBackgroundColor () 메소드를 호출하여 레이아웃을 클래식 Object로 사용하십시오.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.