简体   繁体   English

imagebutton的随机图像,无重复(图片拼图)

[英]Random Image of imagebutton without Repetition (Picture puzzle)

I have 25 Image Buttons and 1 Shuffle button. 我有25个图像按钮和1个随机按钮。 when i click the shuffle button, the buttons will display pictures RANDOMLY WITHOUT REPETITION. 当我单击随机播放按钮时,按钮将随机显示图片而无需重复。 My problem is that it is having an error whenever i click the shuffle button. 我的问题是,每当我单击随机播放按钮时,它就会出错。 It says, "Unfortunately, 'App_Name' has stopped." 它说:“很遗憾,'App_Name'已停止。” Help me please. 请帮帮我。 :( :(

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: Logcat:

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

01-23 09:08:44.004: E/AndroidRuntime(981): java.lang.ArrayIndexOutOfBoundsException: length=24; 01-23 09:08:44.004:E / AndroidRuntime(981):java.lang.ArrayIndexOutOfBoundsException:length = 24; index=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):在com.jepoy.Shift.Main $ 1.onClick(Main.java:102)

01-23 09:08:44.004: E/AndroidRuntime(981): at android.view.View.performClick(View.java:4084) 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.view.View $ PerformClick.run(View.java:16966)

01-23 09:08:44.004: E/AndroidRuntime(981): at android.os.Handler.handleCallback(Handler.java:615) 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.Handler.dispatchMessage(Handler.java:92)

01-23 09:08:44.004: E/AndroidRuntime(981): at android.os.Looper.loop(Looper.java:137) 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): at android.app.ActivityThread.main(ActivityThread.java:4745) 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.invokeNative(本机方法)

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 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):在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):位于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:08:44.004:E / AndroidRuntime(981):在dalvik.system.NativeStart.main(本机方法)

01-23 09:09:42.344: E/Trace(1029): error opening trace file: No such file or directory (2) 01-23 09:09:42.344:E / Trace(1029):打开跟踪文件时出错:没有这样的文件或目录(2)

Its quite clear from your logcat what the error is : 从您的logcat中可以很清楚地看出错误是什么:

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

If the length of an array is 24, then index should be 0-23. 如果数组的长度为24,则索引应为0-23。 In your case the index is reaching to 24 tehreby causing out of index error. 在您的情况下,索引达到24 tehreby会导致索引不足错误。

make sure that your index should not exceed 23 in case you have 24 items. 如果您有24个项目,请确保索引不超过23。

Or make your array of size 25 : int[] a = new int[25]; 或者将数组的大小设置为25: int [] a = new int [25];

Try to use 尝试使用

i = 0

and

while (i < 24){

final int[] easy1 has 24 elements, so it is indexed 0 to 23. If Math.Random() returns a value just below 1, then multiplying by 24 will give a value between 23 and 24. Adding 1 then gives a value between 24 and 25, which is truncuated to 24 by the int cast. final int[] easy1具有24个元素,因此索引为0到23。如果Math.Random()返回的值小于1,则乘以24将得到23到24之间的值。加1则得到的值介于2和24之间。 24和25,由int强制将其截断为24。

So a line like iv1.setImageResource(easy1[a[1]]); iv1.setImageResource(easy1[a[1]]); could attempt to access easy1 at index 24, giving you the error. 可能尝试访问索引24的easy1,从而给您错误。

Incidentally, the code would be clearer and possibly avoid the bug if you create an instance of java.util.Random and use that to generate an integer random number: 顺便说一句,如果创建java.util.Random实例并使用该实例生成整数随机数,代码将更清晰,并且可能避免该错误:

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

rnd will then contain random integers from 1 to 23. rnd将包含1到23之间的随机整数。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM