Android setColorFilter显示空对象引用

Android setColorFilter显示空对象引用,android,android-drawable,Android,Android Drawable,我创建了一个名为btn.xml的布局资源文件,它包含ImageView。 在主活动中,我在content_main.xml中膨胀btn.xml,并尝试设置膨胀视图的背景。但它在一个空对象引用上显示了:Drawable.setColorFilter(int,android.graphics.PorterDuff$Mode)” 在mainActivity中编写java代码: View v; RelativeLayout rlt; @Override protected void onCreate(B

我创建了一个名为btn.xml的布局资源文件,它包含ImageView。 在主活动中,我在content_main.xml中膨胀btn.xml,并尝试设置膨胀视图的背景。但它在一个空对象引用上显示了:Drawable.setColorFilter(int,android.graphics.PorterDuff$Mode)”

在mainActivity中编写java代码:

View v;
RelativeLayout rlt;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    LayoutInflater myInflater = (LayoutInflater) getApplicationContext().getSystemService(getApplicationContext().LAYOUT_INFLATER_SERVICE);
    v = myInflater.inflate(R.layout.btn,null,false);
    // Here is the probelm :
    v.getBackground().setColorFilter(Color.parseColor("#00ff00"), PorterDuff.Mode.DARKEN);
    rlt = (RelativeLayout) findViewById(R.id.rlt);
    rlt.addView(v);
}
content_main.xml布局:


您的线性布局没有任何背景

您可能应该像这样使用setBackgroundColor(int resid)

v.setBackgroundColor(Color.parseColor("#00ff00"));
注意:显式投射膨胀视图更安全。以下是完整的代码:

LinearLayout v;
RelativeLayout rlt;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    LayoutInflater myInflater = (LayoutInflater) getApplicationContext().getSystemService(getApplicationContext().LAYOUT_INFLATER_SERVICE);

    // Explicit Cast to LinearLayout
    v = (LinearLayout) myInflater.inflate(R.layout.btn,null,false);
    // setting background:
    v.setBackgroundColor(Color.parseColor("#00ff00"));

    rlt = (RelativeLayout) findViewById(R.id.rlt);
    rlt.addView(v);
}
在btn.xml文件中,如您所见,您没有将任何可绘制设置为视图(linearlayout),因此出现了空对象引用错误

setColorFilter()方法指定一种颜色和Porter-Duff模式作为可绘制的的颜色过滤器

比如,;如果要更改imageview可绘制(或任何视图可绘制)颜色,应使用setColorFilter()方法

imageview.getDrawable().setColorFilter(color, mode);
如果要更改视图的背景色,则应使用setBackgroundColor()方法

view.setBackgroundColor(getResources().getColor(R.color.anycolor)); 

我编辑了postbtn.xml,它没有背景。为什么您希望getBackground返回非空值?我是android编程新手,所以我该怎么办?我不想改变xml中的背景,但在代码中,你能回答我吗?问题是,你没有背景。因此获取背景显然会返回空值。如果要设置背景,请使用适当的访问器-例如:setBackgroundResource()Resources$NotFoundException:Resource ID#0xff00ff00
setBackgroundResource
将ID作为参数,而不是任意颜色谢谢,它可以工作,但这并不是我想要的结果。我想对以按下模式显示的视图产生一些影响,例如,当我按下视图时,它会变得更暗,以便用户可以看到它确实被按下了。。。。在ImageView上使用setColorFilter(int,android.graphics.PorterDuff$Mode)可以很好地工作