如何在Android中以编程方式设置背景可绘制


288

设置背景:

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
谁可能需要的Kotlin解决方案:stackoverflow.com/a/54495750/6247186
Hamed Jaliliani

Answers:


489

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)

您将需要在应用程序build.gradle中添加以下内容

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 2015年

嘿,我仅在图像按钮的背景图像是某种可绘制资源的情况下才尝试执行任务。我该如何比较...我尝试if(buttonBackground.equals(R.drawable.myDrawable))在哪里Drawable buttonBackground = myButton.getBackground();得到此错误: snag.gy/weYgA.jpg
Ruchir Baronia

您还需要myActivity.getTheme()方法的最新版本,而不是空参数: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
但这是艾哈迈德()的同一件事:)
穆罕默德·埃桑

4
嗯,那我可以参考《懒人忍者》的答案。
艾哈迈德2012年

39
您不需要getResources().getDrawable()。正确的代码layout.setBackgroundResource(R.drawable.ready);就像所使用的OP一样。这里的问题来自位图的大小。
BVB

1
setBackground仅是API级别16或更高。
Erwan 2014年

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


4

我正在使用minSdkVersion 16和targetSdkVersion23。
以下对我有用,它使用

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

而不是使用:

layout.setBackgroundResource(R.drawable.ready);

而是使用:

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

getActivity()如果从活动use调用,则在片段中使用this


2

如果您的背景现在在drawable文件夹中,请尝试将图像从项目中的drawable移到drawable-nodpi文件夹。这对我有用,似乎其他图像由它们自己重新缩放。


5
好吧,如果您没有需要以高清质量在项目中使用的图像的副本,那么为什么让android通过使用普通的drawable文件夹将其缩放到糟糕的质量。甚至这个问题是否古老,如果它仍然在Google中弹出而不是在其中发布新内容,恕我直言。
Jordy 2014年

1

通过使用黄油刀将可绘制资源绑定到变量,方法是将其添加到类的顶部(在任何方法之前)。

@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()方法,将布局用作经典对象。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.