简体   繁体   English

从ArrayList中选择随机ImageButton会引发NullPointerException

[英]Picking a random ImageButton from an ArrayList raises NullPointerException

I'm trying to change the image of an ImageButton that is picked randomly from an ArrayList but raise a NullPointerException. 我正在尝试更改从ArrayList中随机选择的ImageButton的图像,但引发NullPointerException。

I'm attempting to change the ImageButton's image through ImageButton1.setImageResource(R.drawable.someImage); 我正在尝试通过ImageButton1.setImageResource(R.drawable.someImage);来更改ImageButton的图像ImageButton1.setImageResource(R.drawable.someImage); when an ImageButton is clicked. 单击ImageButton时。

Then I want the program to change an ImageResource of some other ImageButton picked randomly from an ArrayList containing ImageButtons I want to use. 然后,我希望程序更改从包含要使用的ImageButton的ArrayList中随机选择的其他ImageButton的ImageResource。 I then want to set that randomly chosen ImageButton's imageResource to someOtherPicture via 然后,我想通过以下方式将随机选择的ImageButton的imageResource设置为someOtherPicture:

ImageButton currentImage;
Random randomNumber = new Random();
int randomNum = randomNumber.nextInt(someArrayList.size());
currentImage = someArrayList.get(randomNum);
currentImage.setImageResource(R.drawable.someOtherImage);

I'm editing in Android Studio and running on a Motorola Moto G device, and when I click the button the app suddenly stops. 我正在Android Studio中进行编辑,并在Motorola Moto G设备上运行,当我单击按钮时,应用程序突然停止。 Log Cat claims it's a NullPointerException on the randomlyPlaceImage() method. Log Cat声称这是randomPlaceImage randomlyPlaceImage()方法上的NullPointerException。

Here's the whole code: 这是整个代码:

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageButton;
import java.util.ArrayList;
import java.util.Random;

public class MainActivity extends Activity {

ImageButton ImageButton1;
ArrayList<ImageButton> someArrayList = new ArrayList<ImageButton>();
Random randomNumber = new Random();

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

addItemsToList();
ImageButton1 = (ImageButton) findViewById(R.id.imageButton1);
        ImageButton1.setOnClickListener(ImageButton1Listener);

}

  addItemsToList (){
    someArrayList.add(ImageButton1);
    someArrayList.add(ImageButton2);
    someArrayList.add(ImageButton3);
    someArrayList.add(ImageButton4);
    someArrayList.add(ImageButton5);
    someArrayList.add(ImageButton6);
    someArrayList.add(ImageButton7);
    someArrayList.add(ImageButton8);
    someArrayList.add(ImageButton9);
}

public void changeImageResource() {
 ImageButton currentImage;
    int randomNum = randomNumber.nextInt(someArrayList.size());
    currentImage = someArrayList.get(randomNum);
    currentImage.setImageResource(R.drawable.someOtherImage);
}

    View.OnClickListener ImageButton1Listener = new View.OnClickListener() {
    @Override
    public void onClick(View v) {

        ImageButton1.setImageResource(R.drawable.someImage);
        someArrayList.remove(ImageButton1);

        changeImageResource();
    }
};    

}

NOTE: The OnCLick method is of course iterated for all ImageButtons 注意:当然,对所有ImageButton都重复了OnCLick方法

It looks like you are adding the items to the list before you are initializing them : 您似乎在初始化之前将项目添加到列表中:

addItemsToList();
ImageButton1 = (ImageButton) findViewById(R.id.imageButton1);
        ImageButton1.setOnClickListener(ImageButton1Listener);

This means someArrayList will hold a bunch of null references. 这意味着someArrayList将保存一堆空引用。

That's why currentImage = someArrayList.get(randomNum); 这就是为什么currentImage = someArrayList.get(randomNum); returns null and currentImage.setImageResource(R.drawable.someOtherImage); 返回null和currentImage.setImageResource(R.drawable.someOtherImage); causes NullPointerException. 导致NullPointerException。

You should change the initialization order to : 您应该将初始化顺序更改为:

ImageButton1 = (ImageButton) findViewById(R.id.imageButton1);
        ImageButton1.setOnClickListener(ImageButton1Listener);
ImageButton2 = (ImageButton) findViewById(R.id.imageButton2);
        ImageButton2.setOnClickListener(ImageButton2Listener);
....
addItemsToList();

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

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