Button.setBackground(Drawable background) throw NoSuchMethodError

2022-09-03 16:50:17

我正在实现一个简单的方法来以编程方式添加一个。ButtonLinearLayout

当我调用 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

您可能正在低于 16 级(Jelly Bean)的 API 上进行测试。

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

推荐