【问题标题】:Random Image of imagebutton without Repetition (Picture puzzle)没有重复的图像按钮的随机图像(图片拼图)
【发布时间】:2014-01-23 01:17:29
【问题描述】:

我有 25 个图像按钮和 1 个随机播放按钮。当我单击随机播放按钮时,按钮将随机显示图片,不重复。我的问题是每次单击随机播放按钮时都会出错。它说:“不幸的是,'App_Name' 已停止。”请帮帮我。 :(

Shuffle.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            final int[] easy1 = {R.drawable.a11,R.drawable.a12,R.drawable.a13,R.drawable.a14,R.drawable.a15
                    ,R.drawable.a16,R.drawable.a17,R.drawable.a18,R.drawable.a19,R.drawable.a110
                    ,R.drawable.a111,R.drawable.a112,R.drawable.a113,R.drawable.a114,R.drawable.a115
                    ,R.drawable.a116,R.drawable.a117,R.drawable.a118,R.drawable.a119,R.drawable.a120
                    ,R.drawable.a121,R.drawable.a122,R.drawable.a123,R.drawable.a124};
            int[] a = new int[25];
            int i = 0;
            int j = 0;
            boolean flag = false;

            flag = false;
            i = 1;
            a[j] = 1;

            while (i <= 24){
             rnd = (int)((Math.random() * 24)+1);

             for (j = 1; j <= i; j++){
                    if (a[j] == rnd)
                {
                    flag = true;

                }
            }

             if (flag == true)
                {
                    flag = false;
                }
                else
                {
                    a[i] = rnd;
                    i = i + 1;
                }
            }

    iv1.setImageResource(easy1[a[1]]);
    iv2.setImageResource(easy1[a[2]]);
    iv3.setImageResource(easy1[a[3]]);
    iv4.setImageResource(easy1[a[4]]);
    iv5.setImageResource(easy1[a[5]]);
    iv6.setImageResource(easy1[a[6]]);
    iv7.setImageResource(easy1[a[7]]);
    iv8.setImageResource(easy1[a[8]]);
    iv9.setImageResource(easy1[a[9]]);
    iv10.setImageResource(easy1[a[10]]);
    iv11.setImageResource(easy1[a[11]]);
    iv12.setImageResource(easy1[a[12]]);
    iv13.setImageResource(easy1[a[13]]);
    iv14.setImageResource(easy1[a[14]]);
    iv15.setImageResource(easy1[a[15]]);
    iv16.setImageResource(easy1[a[16]]);
    iv17.setImageResource(easy1[a[17]]);
    iv18.setImageResource(easy1[a[18]]);
    iv19.setImageResource(easy1[a[19]]);
    iv20.setImageResource(easy1[a[20]]);
    iv21.setImageResource(easy1[a[21]]);
    iv22.setImageResource(easy1[a[22]]);
    iv23.setImageResource(easy1[a[23]]);
    iv24.setImageResource(easy1[a[24]]);
    iv25.setImageResource(R.drawable.a3);
        }

    });

Logcat:

01-23 09:08:44.004: E/AndroidRuntime(981): 致命异常: main

01-23 09:08:44.004: E/AndroidRuntime(981): java.lang.ArrayIndexOutOfBoundsException: length=24;索引=24

01-23 09:08:44.004: E/AndroidRuntime(981): at com.jepoy.Shift.Main$1.onClick(Main.java:102)

01-23 09:08:44.004: E/AndroidRuntime(981): 在 android.view.View.performClick(View.java:4084)

01-23 09:08:44.004: E/AndroidRuntime(981): at android.view.View$PerformClick.run(View.java:16966)

01-23 09:08:44.004: E/AndroidRuntime(981): 在 android.os.Handler.handleCallback(Handler.java:615)

01-23 09:08:44.004: E/AndroidRuntime(981): at android.os.Handler.dispatchMessage(Handler.java:92)

01-23 09:08:44.004: E/AndroidRuntime(981): 在 android.os.Looper.loop(Looper.java:137)

01-23 09:08:44.004: E/AndroidRuntime(981): 在 android.app.ActivityThread.main(ActivityThread.java:4745)

01-23 09:08:44.004: E/AndroidRuntime(981): at java.lang.reflect.Method.invokeNative(Native Method)

01-23 09:08:44.004: E/AndroidRuntime(981): at java.lang.reflect.Method.invoke(Method.java:511)

01-23 09:08:44.004: E/AndroidRuntime(981): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)

01-23 09:08:44.004: E/AndroidRuntime(981): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)

01-23 09:08:44.004: E/AndroidRuntime(981): at dalvik.system.NativeStart.main(Native Method)

01-23 09:09:42.344: E/Trace(1029): 打开跟踪文件时出错:没有这样的文件或目录 (2)

【问题讨论】:

  • 你能看一下LogCat并粘贴红色的错误信息吗?这将有助于解决错误:)

标签: android image random


【解决方案1】:

final int[] easy1 有 24 个元素,因此它的索引为 0 到 23。如果 Math.Random() 返回的值刚好低于 1,那么乘以 24 将得到一个介于 23 和 24 之间的值。加 1 然后得到一个值介于 24 和 25 之间,被 int 演员截断为 24。

因此,iv1.setImageResource(easy1[a[1]]); 之类的行可能会尝试访问索引 24 处的 easy1,从而导致错误。

顺便说一句,如果你创建一个 java.util.Random 的实例并使用它来生成一个整数随机数,代码会更清晰,并且可能避免这个错误:

Random random = new Random();
//...
rnd = random.nextInt(23) + 1;

rnd 将包含从 1 到 23 的随机整数。

【讨论】:

  • 它现在可以工作,但是有两个按钮具有相同的图片。
  • 在这种情况下,您想要的行为由 Collections.shuffle() 方法给出,而不是基于随机索引进行分配。查找该方法的文档,您需要给它一个列表。
【解决方案2】:

从您的 logcat 中可以清楚地看出错误是什么:

01-23 09:08:44.004: E/AndroidRuntime(981): java.lang.ArrayIndexOutOfBoundsException: length=24; index=24

如果数组的长度是 24,那么索引应该是 0-23。在您的情况下,索引达到 24 tehreby 导致索引错误。

如果您有 24 个项目,请确保您的索引不应超过 23。

或者让你的数组大小为 25:int[] a = new int[25];

【讨论】:

    【解决方案3】:

    尝试使用

    i = 0
    

    while (i < 24){
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-15
      • 2020-09-25
      • 2012-12-17
      • 1970-01-01
      相关资源
      最近更新 更多