Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Button.setBackground(Drawable background) throws NoSuchMethodError

I'm implementing a simple method to add a Button to a LinearLayout programatically.

When I invoke the setBackground(Drawable background) method, the following Error is thrown:

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

My addNewButton method:

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);
}
like image 289
Eslam Yousef Mohammed Avatar asked Sep 01 '13 14:09

Eslam Yousef Mohammed


Video Answer


2 Answers

You might be testing on an API below level 16 (Jelly Bean).

The setBackground method is only available from that API level onwards.

I would try with setBackgroundDrawable (deprecated) or setBackgroundResource if that's the case.

For instance:

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);
like image 74
Mena Avatar answered Oct 18 '22 19:10

Mena


To create a homogeneous background for a View, you can create a drawable resource of type shape, and use that with the 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>

Activity:

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

But this will look pretty bad, flat and out of place. If you want a colored button that looks like a button, than you can either design it yourself (rounded corners, stroke, gradient fill...) or a fast and dirty solution is to add a PorterDuff filter to the button's background:

Button b = (Button)findViewById(R.id.myButton);
PorterDuffColorFilter redFilter = new PorterDuffColorFilter(Color.RED, PorterDuff.Mode.MULTIPLY);
b.getBackground().setColorFilter(redFilter);
like image 26
Andras Balázs Lajtha Avatar answered Oct 18 '22 17:10

Andras Balázs Lajtha