Android'de programlı olarak arka plan çizilebilir nasıl ayarlanır


289

Arka Planı ayarlamak için:

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

Bunu yapmanın en iyi yolu mu?


2
Teşekkür ederim! sorunuz ve tüm yardımcı yanıtlar, widget'ın içindeki bir resim düğmesinin arka plan kaynağını ayarlamama yardımcı oldu . İşte birinin ilgilenmesi durumunda örnek bir kod:remoteViews.setInt(R.id.btn_start,"setBackgroundResource", R.drawable.ic_button_start);
Sam

1
Kotlin Çözümü kimlerin ihtiyaç duyabileceği: stackoverflow.com/a/54495750/6247186
Hamed Jaliliani

Yanıtlar:


490

layout.setBackgroundResource(R.drawable.ready);doğru.
Bunu başarmanın başka bir yolu aşağıdakileri kullanmaktır:

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

Ama bence sorun büyük görüntüler yüklemeye çalıştığınız için oluşuyor.
İşte büyük bitmapleri nasıl yerleştirileceğini iyi bir öğretici.

UPDATE:
API düzey 22'de kullanımdan kaldırılan getDrawable (int) artık API düzey 22'de


getDrawable(int ) kullanımdan kaldırıldı. Bunun yerine destek kitaplığından aşağıdaki kodu kullanmalısınız:

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

ContextCompat.getDrawable'ın kaynak koduna başvurursanız , size şöyle bir şey verir:

/**
 * 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 Hakkında Daha Fazla Bilgi

API 22'den getDrawable(int, Theme)itibaren getDrawable (int) yerine yöntemi kullanmalısınız.

GÜNCELLEME:
Destek v4 kitaplığını kullanıyorsanız, tüm sürümler için aşağıdakiler yeterli olacaktır.

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

Uygulama derlemenize aşağıdakileri eklemeniz gerekir.

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

Veya aşağıdaki gibi herhangi bir API'de ResourceCompat kullanarak:

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

3
'getDrawable (int)' kullanımdan kaldırıldı.
S.M_Emamian

Hey, sadece bir görüntü düğmesinin arka plan görüntüsü belirli bir çekilebilir kaynaksa bir görev yapmaya çalışıyorum. Nasıl karşılaştırabilirim ... Bu hatayı if(buttonBackground.equals(R.drawable.myDrawable))nereden Drawable buttonBackground = myButton.getBackground();aldığımı denedim : snag.gy/weYgA.jpg
Ruchir Baronia

Ayrıca myActivity.getTheme()null parametresi yerine yöntemin en son sürümüne de ihtiyacınız olacaktır :myView.setBackground( getResources().getDrawable(R.drawable.my_background, activity.getTheme()));
Zon

veya AppCompatResources.getDrawable(this.getContext(), resId)bunun yerine Google'ı AppCompat*widget / görünümde zaten uygulayabilirsiniz , örneğin:android.support.v7.widget.AppCompatCheckBox
mochadwi

108

Bunu dene:

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

ve API 16 <için:

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

2
ama bu aynı şey Ahmad :)
Mohammad Ersan

4
ah tamam, o zaman Lazy Ninjaların cevabına başvururdum.
Ahmad

39
İhtiyacınız yok getResources().getDrawable(). Doğru kod layout.setBackgroundResource(R.drawable.ready);kullanılan OP gibidir. Buradaki sorun bitmap'in boyutundan geliyor.
BVB

1
setBackground yalnızca API düzey 16 veya üstüdür.
Erwan

17
RelativeLayout relativeLayout;  //declare this globally

şimdi onCreate, onResume gibi herhangi bir fonksiyonun içinde

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

9

Ayrıca herhangi bir Görüntünün arka planını da ayarlayabilirsiniz:

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

Bu benim sorunumu çözmek, ama (.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN)iç kodu uygulamak gerekir
Armando Marques Sobrinho

1
Bu artık kullanımdan kaldırıldı
user7856586

4

Bir minSdkVersion 16 ve targetSdkVersion 23 kullanıyorum
. Aşağıdaki benim için çalışıyor, kullanır

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

Kullanmak yerine:

layout.setBackgroundResource(R.drawable.ready);

Oldukça kullanın:

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

getActivity()bir etkinlik kullanımından çağrı yapılıyorsa, bir parçada kullanılır this.


2

Arka planlarınız şu anda çekilebilir klasördeyse, görüntüleri projenizdeki çekilebilir klasörden çekilebilir nodpi klasörüne taşımayı deneyin. Bu benim için çalıştı, başka görüntüler kendileri tarafından yeniden ölçeklendirilmiş gibi görünüyor.


5
Projede HD kalitesinde kullanmanız gereken görüntülerin bir kopyasına sahip değilseniz, neden normal çekilebilir klasörü kullanarak androidlerin bunları berbat kalitede yeniden ölçeklendirmesine izin verin. Ve soru hala eski, eğer Google'da hala yeni bir şey yayınlamaktan daha fazla açılırsa tamam imho.
Jordy

1

Sınıfınızın üstüne (herhangi bir yöntemden önce) ekleyerek çekilebilir kaynağı bir değişkene bağlamak için butterknife kullanın .

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

sonra yöntemlerden birinin içine ekleyin

layout.setBackground(background);

Tüm ihtiyacınız olan bu


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

Bu kodu deneyin:

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

0

bunu dene.

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


-1

Uygulama içinde / res / your_xml_layout_file .xml

  1. Üst düzeninize bir ad atayın.
  2. MainActivity'ye gidin ve findViewById (R.id. "Given_name") öğesini arayarak RelativeLayout'unuzu bulun.
  3. SetBackgroundColor () yöntemini çağırarak düzeni klasik bir Object olarak kullanın.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.