Cách đặt nền có thể vẽ được lập trình trong Android


289

Để đặt Nền:

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

Là cách tốt nhất để làm điều đó?


2
Cảm ơn bạn! câu hỏi của bạn và tất cả các câu trả lời hữu ích đã giúp tôi đặt tài nguyên nền của nút hình ảnh bên trong một tiện ích . đây là mã mẫu trong trường hợp ai đó quan tâm:remoteViews.setInt(R.id.btn_start,"setBackgroundResource", R.drawable.ic_button_start);
Sam

1
Giải pháp Kotlin cho ai có thể cần: stackoverflow.com/a/54495750/6247186
Hamed Jaliliani

Câu trả lời:


490

layout.setBackgroundResource(R.drawable.ready);đúng.
Một cách khác để đạt được nó là sử dụng như sau:

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

Nhưng tôi nghĩ vấn đề xảy ra bởi vì bạn đang cố tải những hình ảnh lớn.
Đây là một hướng dẫn tốt làm thế nào để tải bitmap lớn.

CẬP NHẬT:
getDrawable (int) không dùng nữa trong API cấp 22


getDrawable(int ) hiện không được chấp nhận ở cấp API 22. Thay vào đó, bạn nên sử dụng mã sau từ thư viện hỗ trợ:

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

Nếu bạn tham khảo mã nguồn của ContextCompat.getDrawable , nó sẽ cung cấp cho bạn một cái gì đó như thế này:

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

Thêm chi tiết về ContextCompat

Kể từ API 22, bạn nên sử dụng getDrawable(int, Theme)phương thức thay vì getDrawable (int).

CẬP NHẬT:
Nếu bạn đang sử dụng thư viện v4 hỗ trợ, những điều sau đây sẽ đủ cho tất cả các phiên bản.

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

Bạn sẽ cần thêm các mục sau trong ứng dụng build.gradle của bạn

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

Hoặc sử dụng ResourceCompat, trong bất kỳ API nào như bên dưới:

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

3
'getDrawable (int)' không được dùng nữa.
S.M_Emamian

Này, tôi đang cố gắng thực hiện một nhiệm vụ chỉ khi hình nền của nút hình ảnh là một tài nguyên có thể vẽ được. Làm thế nào tôi có thể so sánh ... Tôi đã thử if(buttonBackground.equals(R.drawable.myDrawable))nơi Drawable buttonBackground = myButton.getBackground();tôi gặp lỗi này: snag.gy/weYgA.jpg
Ruchir Baronia

Bạn cũng sẽ cần myActivity.getTheme()phiên bản mới nhất của phương thức, thay vì tham số null:myView.setBackground( getResources().getDrawable(R.drawable.my_background, activity.getTheme()));
Zon

hoặc bạn có thể sử dụng AppCompatResources.getDrawable(this.getContext(), resId)thay vào đó, Google đã triển khai nó trong AppCompat*widget / view, ví dụ:android.support.v7.widget.AppCompatCheckBox
mochadwi

108

Thử cái này:

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

và cho API 16 <:

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

2
nhưng đây là điều tương tự Ahmad :)
Mohammad Ersan

4
ah ok, sau đó tôi sẽ tham khảo câu trả lời của Lazy Ninjas.
Ahmad

39
Bạn không cần getResources().getDrawable(). Mã chính xác layout.setBackgroundResource(R.drawable.ready);giống như OP được sử dụng. Vấn đề ở đây xuất phát từ kích thước của bitmap.
BVB

1
setBackground là API cấp 16 trở lên.
Erwan

17
RelativeLayout relativeLayout;  //declare this globally

bây giờ, bên trong bất kỳ chức năng nào như onCreate, onResume

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

9

Bạn cũng có thể đặt nền của bất kỳ Hình ảnh nào:

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

Điều này giải quyết vấn đề của tôi, nhưng tôi cần triển khai (.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN)mã bên trong
Armando Marques Sobrinho

1
Điều này không được chấp nhận ngay bây giờ
user7856586 18/12/18

4

Tôi đang sử dụng minSdkVersion 16 và targetSdkVersion 23.
Phần sau đây hoạt động với tôi, nó sử dụng

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

Thay vì sử dụng:

layout.setBackgroundResource(R.drawable.ready);

Thay vì sử dụng:

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

getActivity()được sử dụng trong một đoạn, nếu gọi từ một hoạt động sử dụng this.


2

Nếu nền của bạn đang ở trong thư mục drawable ngay bây giờ, hãy thử di chuyển các hình ảnh từ thư mục drawable-gậtpi trong dự án của bạn. Điều này làm việc cho tôi, dường như những hình ảnh khác được tự chỉnh lại ..


5
Chà, nếu bạn chưa có một bản sao của những hình ảnh bạn cần sử dụng trong dự án với chất lượng HD, tại sao lại để Android giải phóng chúng thành chất lượng tào lao bằng cách sử dụng thư mục có thể vẽ bình thường. Và thậm chí làm câu hỏi đã cũ, nếu nó vẫn bật lên trong Google hơn là đăng một cái gì đó mới trong đó là ok imho.
Jordy

1

Sử dụng butterknife để liên kết tài nguyên có thể rút ra với một biến bằng cách thêm tài nguyên này vào đầu lớp của bạn (trước bất kỳ phương thức nào).

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

sau đó bên trong một trong các phương thức của bạn thêm

layout.setBackground(background);

Đó là tất cả những gì bạn cần


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

Hãy thử mã này:

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

0

thử cái này.

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


-1

Bên trong ứng dụng / res / your_xml_layout_file .xml

  1. Gán tên cho bố trí cha mẹ của bạn.
  2. Truy cập MainActivity của bạn và tìm RelativeLayout của bạn bằng cách gọi findViewById (R.id. "Given_name").
  3. Sử dụng bố cục như một Đối tượng cổ điển, bằng cách gọi phương thức setBackgroundColor ().
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.