Bagaimana mengatur latar belakang yang dapat digambar secara program di Android

289

Untuk mengatur Latar Belakang:

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

Apakah cara terbaik untuk melakukannya?

Chad Bingham
sumber
2
Terima kasih! pertanyaan Anda dan semua jawaban yang membantu membantu saya mengatur sumber daya latar belakang tombol gambar di dalam widget . berikut adalah contoh kode jika seseorang tertarik:remoteViews.setInt(R.id.btn_start,"setBackgroundResource", R.drawable.ic_button_start);
Sam
1
Kotlin Solution untuk siapa mungkin membutuhkan: stackoverflow.com/a/54495750/6247186
Hamed Jaliliani

Jawaban:

490

layout.setBackgroundResource(R.drawable.ready);benar.
Cara lain untuk mencapainya adalah dengan menggunakan yang berikut:

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

Tapi saya pikir masalahnya terjadi karena Anda mencoba memuat gambar besar.
Berikut ini adalah tutorial yang bagus bagaimana memuat bitmap besar.

UPDATE:
getDrawable (int) yang ditinggalkan dalam API level 22


getDrawable(int ) sekarang ditinggalkan dalam API level 22. Anda harus menggunakan kode berikut dari pustaka dukungan sebagai gantinya:

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

Jika Anda merujuk ke kode sumber ContextCompat.getDrawable , itu memberi Anda sesuatu seperti ini:

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

Lebih detail tentang ContextCompat

Pada API 22, Anda harus menggunakan getDrawable(int, Theme)metode alih-alih getDrawable (int).

UPDATE:
Jika Anda menggunakan perpustakaan dukungan v4, berikut ini akan cukup untuk semua versi.

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

Anda perlu menambahkan yang berikut ini di build.gradle aplikasi Anda

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

Atau menggunakan ResourceCompat, dalam API apa pun seperti di bawah ini:

import android.support.v4.content.res.ResourcesCompat;
ResourcesCompat.getDrawable(getResources(), R.drawable.name_of_drawable, null);
Ninja malas
sumber
3
'getDrawable (int)' sudah usang.
S.M_Emamian
Hei, saya mencoba melakukan tugas hanya jika gambar latar belakang tombol gambar adalah sumber daya tertentu yang dapat ditarik. Bagaimana saya bisa membandingkan ... Saya sudah mencoba di if(buttonBackground.equals(R.drawable.myDrawable))mana Drawable buttonBackground = myButton.getBackground();saya mendapatkan kesalahan ini: snag.gy/weYgA.jpg
Ruchir Baronia
Anda juga perlu myActivity.getTheme()untuk versi terbaru dari metode, daripada parameter nol:myView.setBackground( getResources().getDrawable(R.drawable.my_background, activity.getTheme()));
Zon
atau Anda dapat menggunakannya AppCompatResources.getDrawable(this.getContext(), resId), Google sudah menerapkannya di AppCompat*widget / tampilan, misalnya:android.support.v7.widget.AppCompatCheckBox
mochadwi
108

Coba ini:

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

dan untuk API 16 <:

layout.setBackgroundDrawable(ContextCompat.getDrawable(context, R.drawable.ready));
Ahmad
sumber
2
tetapi ini adalah hal yang sama Ahmad :)
Mohammad Ersan
4
ah ok, maka saya akan merujuk pada jawaban Malas Ninja.
Ahmad
39
Anda tidak perlu getResources().getDrawable(). Kode yang benar layout.setBackgroundResource(R.drawable.ready);sama seperti OP yang digunakan. Masalahnya di sini berasal dari ukuran bitmap.
BVB
1
setBackground hanya API level 16 atau lebih tinggi.
Erwan
17
RelativeLayout relativeLayout;  //declare this globally

sekarang, di dalam fungsi apa pun seperti onCreate, onResume

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

Anda juga dapat mengatur latar belakang Gambar apa pun:

View v;
Drawable image=(Drawable)getResources().getDrawable(R.drawable.img);
(ImageView)v.setBackground(image);
Bhaskar Kumar Singh
sumber
ini menyelesaikan masalah saya, tetapi saya perlu menerapkan (.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN)kode bagian dalam
Armando Marques Sobrinho
1
Ini sudah ditinggalkan sekarang
user7856586
4

Saya menggunakan minSdkVersion 16 dan targetSdkVersion 23.
Berikut ini berfungsi untuk saya, ia menggunakan

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

Alih-alih menggunakan:

layout.setBackgroundResource(R.drawable.ready);

Sebaliknya gunakan:

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

getActivity()digunakan dalam fragmen, jika memanggil dari aktivitas yang digunakan this.

Vostro
sumber
2

Jika latar belakang Anda berada di folder yang dapat digambar sekarang coba pindahkan gambar dari folder drawable ke drawable-nodpi di proyek Anda. Ini bekerja untuk saya, sepertinya gambar-gambar itu diubah oleh mereka sendiri ..

Jordy
sumber
5
Nah, jika Anda belum mendapatkan salinan gambar yang perlu Anda gunakan dalam proyek dalam kualitas HD, mengapa Android mengubah skala mereka menjadi kualitas jelek dengan menggunakan folder drawable normal. Dan bahkan pertanyaannya sudah lama, jika masih muncul di Google daripada memposting sesuatu yang baru di dalamnya ok imho.
Jordy
1

Gunakan butterknife untuk mengikat sumber gambar ke variabel dengan menambahkan ini ke atas kelas Anda (sebelum metode apa pun).

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

lalu di dalam salah satu metode Anda tambahkan

layout.setBackground(background);

Itu yang kamu butuhkan

Stephen
sumber
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));
Sameer Chamankar
sumber
1

Cobalah ViewCompat.setBackground(yourView, drawableBackground)

Umair Khalid
sumber
0

Coba kode ini:

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

coba ini.

 int res = getResources().getIdentifier("you_image", "drawable", "com.my.package");
 preview = (ImageView) findViewById(R.id.preview);
 preview.setBackgroundResource(res);
Franklin CI
sumber
0
setBackground(getContext().getResources().getDrawable(R.drawable.green_rounded_frame));
Mohamed AbdelraZek
sumber
1
Tolong penjelasan iklan.
vonbrand
-1

Di dalam aplikasi / res / your_xml_layout_file .xml

  1. Tetapkan nama untuk tata letak induk Anda.
  2. Pergi ke MainActivity Anda dan temukan RelativeLayout Anda dengan memanggil findViewById (R.id. "Given_name").
  3. Gunakan tata letak sebagai Obyek klasik, dengan memanggil metode setBackgroundColor ().
Vaggos Phl
sumber