2013-09-01 61 views
11

Tôi đang triển khai một phương pháp đơn giản để thêm Button vào một LinearLayout theo chương trình.Button.setBackground (Nền có thể vẽ) ném NoSuchMethodError

Khi tôi gọi phương thức setBackground (nền drawable), các Error sau được ném:

java.lang.NoSuchMethodError: android.widget.Button.setBackground

phương pháp addNewButton của tôi:

private void addNewButton(Integer id, String name) { 

     Button b = new Button(this); 
     b.setId(id); 
     b.setText(name); 
     b.setTextColor(color.white); 
     b.setBackground(this.getResources().getDrawable(R.drawable.orange_dot)); 
      //llPageIndicator is the Linear Layout. 
     llPageIndicator.addView(b); 
} 

Trả lời

29

Bạn có thể thử nghiệm trên một API dưới cấp 16 (Jelly Bean).

Phương thức setBackground chỉ khả dụng từ cấp API đó trở đi.

Tôi sẽ thử với setBackgroundDrawable (không dùng nữa) hoặc setBackgroundResource nếu đúng như vậy.

Ví dụ:

Drawable d = getResources().getDrawable(R.drawable.ic_launcher); 
Button one = new Button(this); 
// mediocre 
one.setBackgroundDrawable(d); 
Button two = new Button(this); 
// better 
two.setBackgroundResource(R.drawable.ic_launcher); 
+0

Vì vậy, là những gì các giải pháp để thêm nút nền của chương trình để thấp hơn Api 16..withou t setBackGroundDrawable..which không được dùng nữa ...? –

+1

@EslamYousefMohammed đã chỉnh sửa câu trả lời của tôi: thử 'setBackgroundResource'. – Mena

+0

tôi đã đặt android: minSdkVersion = "9" trong tệp kê khai của tôi, tại sao không nhật thực cảnh báo tôi về điều đó? – wutzebaer

-1

Bạn không thể sử dụng setBackground(). Phương pháp này có thể không khả dụng ở cấp độ Android của bạn.

+0

FYI: Ở dạng hiện tại của nó, đây là một [bình luận] (http://stackoverflow.com/help/privileges/comment) hơn là một câu trả lời. (Đó có lẽ là lý do tại sao nó đã bị bỏ phiếu). Một "câu trả lời" cũng nên bao gồm các lựa chọn thay thế có thể để giải quyết vấn đề, [như đã làm câu trả lời được chấp nhận] (http://stackoverflow.com/a/18559344/104223). Xem câu trả lời]. – Leigh

1

Để tạo nền đồng nhất cho Chế độ xem, bạn có thể tạo tài nguyên có thể vẽ dạng hình dạng và sử dụng tài nguyên đó với setBackgroundResource.

red_background.xml

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> 
    <solid android:color="#FF0000"/>  
</shape> 

Hoạt động:

Button b = (Button)findViewById(R.id.myButton); 
b.setBackgroundResource(R.drawable.red_background); 

Nhưng điều này sẽ trông khá xấu, phẳng và ra khỏi chỗ. Nếu bạn muốn nút màu trông giống như nút, bạn có thể tự thiết kế (góc tròn, nét vẽ, tô màu tô dốc ...) hoặc giải pháp nhanh và bẩn là thêm bộ lọc PorterDuff vào nền của nút:

Button b = (Button)findViewById(R.id.myButton); 
PorterDuffColorFilter redFilter = new PorterDuffColorFilter(Color.RED, PorterDuff.Mode.MULTIPLY); 
b.getBackground().setColorFilter(redFilter); 
0

Kể từ sau khi Android 16, setBackgroundDrawable bị phản đối, tôi đề nghị để kiểm tra trước khi mã bộ

bạn cần phải kiểm tra phiên bản hiện tại của Android cũng

Button bProfile; // your Button 
Bitmap bitmap; // your bitmap 

if(android.os.Build.VERSION.SDK_INT < 16) { 
    bProfile.setBackgroundDrawable(new BitmapDrawable(getResources(), bitmap)); 
} 
else { 
    bProfile.setBackground(new BitmapDrawable(getResources(),bitmap)); 
}