在view.getTag获取Nullpointer

时间:2014-01-23 16:37:01

标签: android button onclick nullpointerexception

我尝试使用其中一个按钮的ID设置标记:

     int boeserzufall = (int) (Math.random()*23);
     Button boese = arr.get(boeserzufall);
     boese.setBackgroundResource(R.drawable.williboese);
     boese.setTag(R.drawable.williboese);

工作正常,boese.getTag()为我带来了正确的身份证明。 arrArrayList<Button>,其中包含我的所有按钮。

现在在我的OnClick()方法中,我想检查当前按钮是否与boese具有相同的resId

    b5.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {
            count++;
            int resId = (Integer) arg0.getTag();
            if(resId == R.drawable.williboese) {
                Toast.makeText(MainActivity.this, "heeeee", Toast.LENGTH_SHORT).show();
            }

        }
    });

我的问题是,当我尝试阅读arg0.getTag()

时,我得到了一个N​​ullpointer异常

修改

首先,我从数组中取出一个随机按钮,因此我想用R.drawable.williboese设置背景图像。 因此,在我的25个按钮中,我的背景图像与其他图像不同。这个我必须找到并做出与其他人不同的反应......

2 个答案:

答案 0 :(得分:1)

如果按钮没有标记,当您的代码尝试将标记解包到int时,您将获得NPE。如果您确定唯一的标记是Integer个对象,则可以尝试这样做:

b5.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View arg0) {
        count++;
        Integer resId = (Integer) arg0.getTag();
        if(resId != null && resId == R.drawable.williboese) {
            Toast.makeText(MainActivity.this, "heeeee", Toast.LENGTH_SHORT).show();
        }

    }
});

如果标签可能存在并且不是Integer,那么您还应该防范ClassCastException(或声明resId为{{1}并使用Object替换resId != null并仅在传递时执行转换。

但是,查看整体逻辑,您可能会发现View.findViewWithTag(Object)是一种有用的方法,可以绕过测试。

答案 1 :(得分:1)

根据您的上一次编辑,您只在25个特定按钮上设置了一个标记。这是一个自动装入整数的int。您甚至不需要标记的值,因为这仅在该特定按钮上为非null。这应该做:

public void onClick(View view) {
    count++;
    if(view.getTag() != null) {
        Toast.makeText(MainActivity.this, "heeeee", Toast.LENGTH_SHORT).show();
    }
}