Как установить фон drawable программно в Android

установить фон:

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

- Это лучший способ сделать это?

11 ответов


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

но я думаю, что проблема происходит потому, что вы пытаетесь загрузить большие изображения.
здесь это хороший учебник, как загрузить большие растровые изображения.

обновление:
getDrawable (int ) устарел на уровне API 22


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).

обновление:
Если вы используете библиотеку support v4, для всех будет достаточно следующего версии.

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

вам нужно будет добавить следующее в сборку приложения.Gradle в

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

или с помощью ResourceCompat, в любом API, как показано ниже:

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

попробуйте это:

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

и для API 16<:>

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


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

вы также можете установить фон любого изображения:

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

Если ваши фоны находятся в папке drawable прямо сейчас попробуйте переместить изображения из папки drawable в папку drawable-nodpi в вашем проекте. Это сработало для меня, кажется, что еще изображения масштабируются ими самими..


Я использую 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


использовать butterknife привязать ресурс drawable к переменной, добавив его в верхнюю часть класса (перед любыми методами).

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

затем внутри одного из ваших методов добавьте

layout.setBackground(background);

Это все, что вам нужно


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

попробуйте этот код:

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

попробуйте ViewCompat.setBackground(yourView , drawableBackground)


внутри приложения / res/your_xml_layout_file.в XML

  1. назначьте имя родительскому макету.
  2. перейдите к своей MainActivity и найдите свой RelativeLayout, вызвав findViewById (R. id."given_name").
  3. используйте макет как классический объект, вызвав метод setBackgroundColor ().