【问题标题】:Android Studio: Iterate through images in drawable for onClick imageButtonAndroid Studio:为onClick imageButton遍历drawable中的图像
【发布时间】:2016-04-19 23:16:37
【问题描述】:

我目前有 8 个 imageButtons 设置了 id 的 imageButton1 到 imageButton8。

当我单击特定按钮(例如 imageButton2)时,我想遍历名为 image1....image10 的可绘制文件夹中的图像,并将图像设置为每次单击时的 imageButton。

我已经查看了各种 for 循环来解决这个问题,但它们没有任何结果。这是 for 循环尝试的 sn-p:
26/4/16 更新
已解决

//UPDATED 25/4/16
ImageButton btn1, btn2, btn3, btn4, btn5, btn6, btn7, btn8;
ImageButton[] btns;
int[] drawables = new int[]{R.drawable.image1,R.drawable.image2,R.drawable.image3,R.drawable.image4,R.drawable.image5,R.drawable.image6,R.drawable.image7,R.drawable.image8};


@Override
protected void onCreate(Bundle savedInstanceState) {  

    btn1 = (ImageButton) findViewById(R.id.imageButton1);
    btn2 = (ImageButton) findViewById(R.id.imageButton2);
    btn3 = (ImageButton) findViewById(R.id.imageButton3);
    btn4 = (ImageButton) findViewById(R.id.imageButton4);
    btn5 = (ImageButton) findViewById(R.id.imageButton5);
    btn6 = (ImageButton) findViewById(R.id.imageButton6);
    btn7 = (ImageButton) findViewById(R.id.imageButton7);
    btn8 = (ImageButton) findViewById(R.id.imageButton8);

        btn1.setOnClickListener(this);
        btn2.setOnClickListener(this);
        btn3.setOnClickListener(this);
        btn4.setOnClickListener(this);
        btn5.setOnClickListener(this);
        btn6.setOnClickListener(this);
        btn7.setOnClickListener(this);
        btn8.setOnClickListener(this);
}


btns = new ImageButton[]{btn1, btn2, btn3, btn4, btn5, btn6, btn7, btn8};
}

int counter = 0;
        @Override
    public void onClick(View v)
        {

            counter ++;


            for (int i = 0; i < btns.length; i++)
            {


                if (v.getId() == btns[i].getId())
                {
                    if(counter ==8)
                    {
                        counter =0;
                    }

                        ((ImageButton)v).setImageResource(drawables[counter]);

                }

            }
}
}

26/4/16 更新 解决了

另一种尝试是创建一个计数器来存储点击次数并设置 if 语句以根据每次点击更改图像。

这里的问题是考虑到我有多个按钮,它会创建大量代码。

最重要的是,当我在两个不同的按钮上运行它时,一旦我点击 imageButton1 几次,然后点击 imageButton2 几次,imageButton1 不再响应。

int counter =0;

        @Override
    public void onClick(View v)
        {
            counter++;


            switch(v.getId())
            {
                case R.id.imageButton1:
                    if(counter == 1){

                        ImageButton btn1 = (ImageButton) findViewById(R.id.imageButton1);
                        btn1.setImageResource(R.drawable.image1);
                        break;

                    }else if (counter == 2){

                        ImageButton btn1 = (ImageButton) findViewById(R.id.imageButton1);
                        btn1.setImageResource(R.drawable.image2);
                        break;

                    }else if (counter == 3){

                        ImageButton btn1 = (ImageButton) findViewById(R.id.imageButton1);
                        btn1.setImageResource(R.drawable.image3);

                        break;

                    }else if (counter == 4){

                        ImageButton btn1 = (ImageButton) findViewById(R.id.imageButton1);
                        btn1.setImageResource(R.drawable.image4);

                        break;
                    }else if (counter == 5){

                        ImageButton btn1 = (ImageButton) findViewById(R.id.imageButton1);
                        btn1.setImageResource(R.drawable.image5);
                        break;

                    }else if (counter == 6){

                        ImageButton btn1 = (ImageButton) findViewById(R.id.imageButton1);
                        btn1.setImageResource(R.drawable.image6);

                        break;

                    }else if (counter == 7){

                        ImageButton btn1 = (ImageButton) findViewById(R.id.imageButton1);
                        btn1.setImageResource(R.drawable.image7);

                        break;
                    }else if (counter == 8){

                        ImageButton btn1 = (ImageButton) findViewById(R.id.imageButton1);
                        btn1.setImageResource(R.drawable.image8);
                        break;

                    }else if (counter == 9){

                        ImageButton btn1 = (ImageButton) findViewById(R.id.imageButton1);
                        btn1.setImageResource(R.drawable.image9);

                        break;

                    }else if (counter == 10) {

                        ImageButton btn1 = (ImageButton) findViewById(R.id.imageButton1);
                        btn1.setImageResource(R.drawable.image10);
                        counter = 0;
                        break;
                    }
                    break;

我将不胜感激任何指导,同时如果我解决了这个问题,我将重新发布编辑。干杯

【问题讨论】:

    标签: android loops for-loop drawable imagebutton


    【解决方案1】:

    只是一个建议。

    也许您可以将按钮和图像资源声明为数组,然后循环它们。

    例如:

    public class Sample extends Activity {
    
      ImageButton btn1, btn2, btn3, btn4, btn5, btn6, btn7, btn8;
      ImageButton[] btns;
      int[] drawables = new int[]{R.drawable.imageButton1,R.drawable.imageButton2,R.drawable.imageButton3,R.drawable.imageButton4,R.drawable.imageButton5,R.drawable.imageButton6,R.drawable.imageButton7,R.drawable.imageButton8};
      int[] origDrawables = new int[]{R.drawable.imageOrigButton1,R.drawable.imageOrigButton2,R.drawable.imageOrigButton3,R.drawable.imageOrigButton4,R.drawable.imageOrigButton5,R.drawable.imageOrigButton6,R.drawable.imageOrigButton7,R.drawable.imageOrigButton8};
    
      @Override
      public void onCreate(Bundle saveInstanceState) {
        btn1 = (ImageButton) findViewById(R.id.imageButton1);
        btn2 = (ImageButton) findViewById(R.id.imageButton2);
        btn3 = (ImageButton) findViewById(R.id.imageButton3);
        btn4 = (ImageButton) findViewById(R.id.imageButton4);
        btn5 = (ImageButton) findViewById(R.id.imageButton5);
        btn6 = (ImageButton) findViewById(R.id.imageButton6);
        btn7 = (ImageButton) findViewById(R.id.imageButton7);
        btn8 = (ImageButton) findViewById(R.id.imageButton8);
    
        btn1.setOnClickListener(this);
        btn2.setOnClickListener(this);
        btn3.setOnClickListener(this);
        btn4.setOnClickListener(this);
        btn5.setOnClickListener(this);
        btn6.setOnClickListener(this);
        btn7.setOnClickListener(this);
        btn8.setOnClickListener(this);
    
        btns = new ImageButton[]{btn1, btn2, btn3, btn4, btn5, btn6, btn7, btn8};
      }
    
      @Override
      public void onClick(View v) {
        for (int i = 0; i < btns.length; i++) {
          if (v.getId == btns[i].getId) {
            ((ImageButton)v).setImageResource(drawables[i]);
          } else {
            ((ImageButton)v).setImageResource(origDrawables[i]);
          }
        }
      }
    
    }
    

    注意:请原谅我使用记事本执行此操作的任何代码/语法错误。

    【讨论】:

    • 我之前尝试过类似的方法,但出现错误显示无法解析“setImageResource(int)”
    • 用这个“((ImageButton)v).setImageResource(drawables[i]);”更新了我的答案。我认为错误“无法解决”的原因是因为 View 对象没有它。所以我们可能需要将它转换为 ImageButton 来获取方法。
    • public void onClick(View v) { for (int i = 0; i
    • 在 android.view.View.performClick(View.java:4760) 在 android.view.View$PerformClick.run(View.java:19774) 在 android.os.Handler.handleCallback(Handler .java:739) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:135) 在 android.app.ActivityThread.main(ActivityThread.java:5218)在 java.lang.reflect.Method.invoke(Native Method) 在 java.lang.reflect.Method.invoke(Method.java:372) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:第959章)在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:754)
    • 对代码进行了一些更正。你能再试一次吗?
    【解决方案2】:

    试试这个

        int counter = 1;
        @Override
        public void onClick(View v)
        {
            switch(v.getId())
            {
                case R.id.imageButton1:
                 ImageButton btn1 = (ImageButton) findViewById(R.id.imageButton1);
                   if(counter == 1){
                        btn1.setImageResource(R.drawable.image1);
                    }else if (counter == 2){
                        btn1.setImageResource(R.drawable.image2);
                    }else if (counter == 3){
                        btn1.setImageResource(R.drawable.image3);
                    }else if (counter == 4){
                        btn1.setImageResource(R.drawable.image4);
                    }else if (counter == 5){
                        btn1.setImageResource(R.drawable.image5);
                    }else if (counter == 6){
                        btn1.setImageResource(R.drawable.image6);
                    }else if (counter == 7){
                        btn1.setImageResource(R.drawable.image7);
                    }else if (counter == 8){
                        btn1.setImageResource(R.drawable.image8);
                    }else if (counter == 9){
                        btn1.setImageResource(R.drawable.image9);
                    }else if (counter == 10) {
                        btn1.setImageResource(R.drawable.image10);
                    }
    
                counter = (counter % 10) + 1 ;
                    break;
        }
    

    【讨论】:

    • ??你做错了......将所有if...else 放在开关内是错误的。首先检查带有if 的按钮,然后将开关放入其中。
    • @CaptJak 这是个问题吗?为什么我不能把if..else 放在switch 里面?
    • 可以这样做,它会起作用,但是如果你这样做,你为什么要使用开关?你为什么使用if...else?你为什么不只使用其中一个?出于性能原因,您应该使用开关。见:stackoverflow.com/questions/6705955/…
    猜你喜欢
    • 2015-01-12
    • 2016-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多