如何为多个ImageButtons设置onTouchListener

时间:2013-01-04 06:55:35

标签: android listener imagebutton

我有这个:

// Set up touch listeners for all the buttons
    View cardButton = findViewById(R.id.C_0);
    cardButton.setTag(0);
    cardButton.setOnTouchListener(this);
    View cardButton1 = findViewById(R.id.C_1);
    cardButton1.setTag(1);
    cardButton1.setOnTouchListener(this);
    View cardButton2 = findViewById(R.id.C_2);
    cardButton2.setTag(2);
    cardButton2.setOnTouchListener(this);
    View cardButton3 = findViewById(R.id.C_3);
    cardButton3.setTag(3);
    cardButton3.setOnTouchListener(this);
    View cardButton4 = findViewById(R.id.C_4);
    cardButton4.setTag(4);
    cardButton4.setOnTouchListener(this);
    View cardButton5 = findViewById(R.id.C_5);
    cardButton5.setTag(5);
    cardButton5.setOnTouchListener(this);
    View cardButton6 = findViewById(R.id.C_6);
    cardButton6.setTag(6);
    cardButton6.setOnTouchListener(this);
    View cardButton7 = findViewById(R.id.C_7);
    cardButton7.setTag(7);
    cardButton7.setOnTouchListener(this);
    View cardButton8 = findViewById(R.id.C_8);
    cardButton8.setTag(8);
    cardButton8.setOnTouchListener(this);

但是我需要以编程方式生成它,所以我不能像这样写出来。不幸的是,我尝试了三种方法但没有工作。首先:

for(int i = 0; i < 9; i++)
    {
        String bufferName = "C_" + i;
        int tempid = getResources().getIdentifier(bufferName, "drawable", getPackageName());
        View cardButton = findViewById(tempid);
        cardButton.setTag(i);
        cardButton.setOnTouchListener(this);
    }

这给了我一个NullPointerException。我不确定如何确定它。此外,Android的事情说你不应该使用getIdentifier,因为它很昂贵。

下一次尝试:

ViewGroup rootLayout=(ViewGroup) sv.getRootView();
    View v;
    int id = 0;
    for(int i = 0; i < rootLayout.getChildCount(); i++) {
        v = rootLayout.getChildAt(i);
        if(v instanceof View)
        {
            v.setTag(id);
            id += 1;
            v.setOnTouchListener(this);
        };
    }

这里没有错误,但没有任何按钮可以工作了。要么没有设置听众,要么没有正确记录触摸或其他任何内容。

第三次尝试:

int[] ids = {R.id.C_0, R.id.C_1, R.id.C_2, R.id.C_3, R.id.C_4, R.id.C_5, R.id.C_6, R.id.C_7, R.id.C_8};
    for (int id:ids)
    {
        ImageView b = (ImageView)findViewById(id);
        b.setTag(ids);
        b.setOnTouchListener(this);
    }

这是最糟糕的方法,我不想使用它,但即使这样也行不通。我得到了ClassCastException。我尝试使用ImageButton b = (ImageButton)findViewById(id);,但仍然遇到了同样的错误。对不起,如果这是全新的,但我花了好几个小时试图找到一种方法来做到这一点。 :(

1 个答案:

答案 0 :(得分:0)

<强>首先
你的第一次尝试非常接近...... 你在这里使用了错误的类型:

int tempid = getResources().getIdentifier(bufferName, "drawable", getPackageName());

您需要id,请使用:

int tempid = getResources().getIdentifier(bufferName, "id", getPackageName());

下一次尝试:
这个看起来没问题,也许是OnTouchListener有错误。


第三次尝试:
ClassCastException只是意味着您在XML中声明的任何View类型必须是您在Java代码中使用的View类型...