[英]Picking a random ImageButton from an ArrayList raises 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.