Androidでプログラムによって背景ドローアブルを設定する方法


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);
サム・

1
必要な場合があるKotlinソリューション:stackoverflow.com/a/54495750/6247186
Hamed 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)は、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)

アプリの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()));
ゾン

または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
これはアフマドと同じことです:)
Mohammad Ersan 2012

4
ああ、わかりました、それから私は怠惰な忍者の答えを参照します。
Ahmad

39
必要ありませんgetResources().getDrawable()。正しいコードはlayout.setBackgroundResource(R.drawable.ready);、使用されるOP とまったく同じです。ここでの問題は、ビットマップのサイズに起因します。
BVB 2013

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

9

任意の画像の背景を設定することもできます:

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

これで私の問題は解決しますが、(.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN)内部コードを実装する必要があります
Armando Marques 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()アクティビティからの呼び出しの場合、フラグメントで使用されますthis


2

背景がドローアブルフォルダーにある場合は、画像をドローアブルからプロジェクトのドローアブルnodpiフォルダーに移動してみてください。これは私にとってはうまくいきました、他の画像は彼ら自身によって再スケーリングされているようです。


5
プロジェクトで使用する必要がある画像のコピーをHD品質で取得していない場合は、通常のドローアブルフォルダーを使用して、androidに低品質の画像に再スケーリングさせてください。そして、質問が古い場合でも、それがまだ新しいものを投稿するよりもGoogleにポップアップ表示される場合は問題ありません。
ジョーディ14

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()を呼び出して、レイアウトをクラシックオブジェクトとして使用します。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.