【问题标题】:Getting a Nullpointer at view.getTag在 view.getTag 获取 Nullpointer
【发布时间】:2014-02-14 08:26:09
【问题描述】:

我尝试使用我的一个按钮的 ID 设置标签:

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

这很好,boese.getTag() 给我带来了正确的 ID。 arr 是一个 ArrayList<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() 时出现 Nullpointer 异常

编辑:

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

【问题讨论】:

  • 您是否在将按钮添加到数组列表之前对其进行初始化?
  • 你在 b5 上设置了 onClickListener...是同一个 boese 实例吗?
  • 为不同的按钮设置标签并为不同的按钮获取标签。你也给 b5 设置了标签吗?
  • 我编辑了我的问题以获取更多信息
  • 也许这个答案...看here

标签: android button onclick nullpointerexception


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    如果按钮没有标签,当您的代码尝试将标签拆箱为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声明为Object并将resId != null替换为resId instanceof Integer 并且只有在通过时才进行演员表。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-11
      • 2011-09-08
      • 1970-01-01
      • 2018-03-12
      相关资源
      最近更新 更多