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?


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

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

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

9

Anda juga dapat mengatur latar belakang Gambar apa pun:

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

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.


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


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


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

Coba kode ini:

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

0

coba ini.

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


-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 ().
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.