按钮.setBackground(Drawable background)抛出NoSuchMethodError异常

14

我正在实现一个简单的方法,通过程序将 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);
}
6个回答

42

你可能正在使用低于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);

那么,在API 16以下的版本中,如何在程序中添加按钮的背景而不使用已弃用的setBackGroundDrawable方法呢?您知道解决方案吗? - Eslam Yousef Mohammed
1
@EslamYousefMohammed编辑了我的答案:尝试使用“setBackgroundResource”。 - Mena
我在清单文件中设置了android:minSdkVersion="9",为什么Eclipse没有警告我呢? - wutzebaer
@Mena 我尝试在FrameLayout上使用setBackgroundResource,但对我来说不起作用。 - V01

3
为了为一个视图创建一个均匀的背景,您可以创建一个类型为形状的可绘制资源,并将其与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);

0

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

0

将主题从Theme.MaterialComponents更改为Theme.AppCompat


0
            <Button
                android:id="@+id/btnregister"
                android:layout_width="150dp"
                android:layout_height="45dp"
                android:layout_gravity="center"
                android:layout_marginHorizontal="10dp"
                android:layout_marginVertical="20dp"
                android:paddingVertical="5dp"
                style="@style/btn_register"
                android:text="Register"
                android:textColor="#FFFFFF" />

请在Styles.xml文件中应用下面的代码:

 <style name="btn_register">
        <item name="android:layout_marginTop">15dp</item>
        <item name="android:backgroundTint">#009688</item>
        <item name="cornerRadius">20dp</item>
    </style>

-1

你不能使用 setBackground() 方法。这个方法可能在你的 Android 版本中不可用。


1
FYI:以目前的形式,这更像是一个评论,而不是一个答案。(这可能就是为什么它被投票下降的原因)。一个“答案”应该包括解决问题的可能替代方案,正如被接受的答案所做的那样。请参见[答案]。 - Leigh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接