Button.setBackground(Drawable background) бросает NoSuchMethodError

Я реализую простой метод для добавления Button к LinearLayout программно.

Когда я вызываю метод setBackground (Drawable background), вызывается следующее Error:

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

Мой метод addNewButton:

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

Ответ 1

Возможно, вы тестируете API ниже уровня 16 (Jelly Bean).

Метод setBackground доступен только с этого уровня API.

Я хотел бы попробовать с setBackgroundDrawable (устаревшее) или setBackgroundResource, если это так.

Например:

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

Ответ 2

Чтобы создать однородный фон для представления, вы можете создать ресурс с возможностью рисования формы типа и использовать его с помощью 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>

Активность:

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

Но это будет выглядеть довольно плохим, плоским и неуместным. Если вы хотите, чтобы цветная кнопка выглядела как кнопка, вы можете сами ее спроектировать (закругленные углы, штрих, градиентная заливка...) или быстрое и грязное решение - добавить фильтр PorterDuff к фону кнопки:

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

Ответ 3

Так как после Android 16, setBackgroundDrawable устарел, я предложил проверить перед установленным кодом

вам нужно также проверить текущую версию Android.

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

Ответ 4

Вы не можете использовать setBackground(). Этот метод может быть недоступен на вашем уровне Android.