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

时间:2012-09-21 01:05:16

标签: java android background drawable

设置背景:

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

这是最好的方法吗?

13 个答案:

答案 0 :(得分:434)

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));
}

但我认为问题的出现是因为您正在尝试加载大图片。
Here是一个很好的教程,如何加载大位图。

更新:
在API级别22中弃用了getDrawable(int)


现在,API级别22已弃用getDrawable(int )。 您应该使用支持库中的以下代码:

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)

您需要在app 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);

答案 1 :(得分:100)

试试这个:

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

和API 16&lt;:

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

答案 2 :(得分:14)

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

答案 3 :(得分:7)

您还可以设置任何图像的背景:

fatal error: unexpectedly found nil while unwrapping an Optional value 

答案 4 :(得分:3)

如果您的背景现在位于可绘制文件夹中,请尝试将图像从drawable移动到项目中的drawable-nodpi文件夹。这对我有用,似乎其他的图像都是由他们自己重新调整的。

答案 5 :(得分:2)

我使用minSdkVersion 16和targetSdkVersion 23.
以下是我的工作,它使用

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

而不是使用:

layout.setBackgroundResource(R.drawable.ready);

而是使用:

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

getActivity()用于片段,如果从活动中调用this

答案 6 :(得分:1)

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

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

然后在你的一个方法中添加

layout.setBackground(background);

这就是你所需要的一切

答案 7 :(得分: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));

答案 8 :(得分:0)

试试这段代码:

oneway interface IPackageStatsObserver {

    void onGetStatsCompleted(in PackageStats pStats, boolean succeeded);

}

答案 9 :(得分:0)

尝试ViewCompat.setBackground(yourView , drawableBackground)

答案 10 :(得分:0)

在app / res / your_xml_layout_file .xml

  1. 为您的父版面指定名称。
  2. 转到您的MainActivity并通过调用findViewById(R.id。&#34; given_name&#34;)找到您的RelativeLayout。
  3. 通过调用方法setBackgroundColor()。
  4. 将布局用作经典对象

答案 11 :(得分:0)

尝试一下。

<r>
  <cell c='0' r='0' val='x1'/>
  <cell c='1' r='0' val='x1'/>
  <cell c='2' r='0' val='x1'/>

  <cell c='0' r='1' val='x1'/>
  <cell c='1' r='1' val='y1'/>
  <cell c='2' r='1' vala'y1'/>

  <cell c='0' r='2' val='x1'/>
  <cell c='1' r='2' val='x3'/>
  <cell c='2' r='2' val='x3'/>
</r>

答案 12 :(得分:0)

setBackground(getContext().getResources().getDrawable(R.drawable.green_rounded_frame));