我正在尝试创建一个代码,当我运行一个应用程序时,有一个随机图像,当我点击它时,它显示一个不同的随机图像,但我得到错误,我只有1天的经验和Java语言。
请帮忙。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
int[] photos={R.drawable.img1, R.drawable.img2,R.drawable.img3,R.drawable.img4};
ImageView image=(ImageView)findViewById(R.id.imageview1);
Random rnd=new Random();
★1 int i=ran.nextInt(photos.length);
image.setImageResource(photos[i]);
image.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
★2 int k=ran.nextInt(photos.length);
★3 image.setImageResource(photos[k]);
}
}
);
}
我添加★以显示错误的位置。
★1“跑不能解决” ★2“不能参考以不同方法定义的内部类中的非最终变量照片” “跑得无法解决” ★3“不能引用在不同方法中定义的内部类中的非最终变量图像” “不能引用在不同方法中定义的内部类中的非最终变量照片”
我尝试刷新并且还做了ctrl + shift + o,无法弄清问题在哪里......
答案 0 :(得分:4)
1)您已声明变量rnd
,但之后您尝试将其称为ran
。你需要保持一致。
2和3)photos
和rnd
都需要声明为final
变量,因为您在匿名内部类中使用它们。
当局部变量在匿名内部类中使用时,关于局部变量的最终业务基本上是因为匿名内部类的工作方式。基本上,当您构造一个实例时,它会将局部变量值传递给匿名内部类的(生成的)构造函数,该构造函数会保留这些变量的副本,以便以后使用它们。通过将变量限制为final
个,可以避免在方法或匿名内部类中更改变量的情况,而这些变化在其他上下文中不会被看到。
答案 1 :(得分:1)
1)我猜你的意思是rnd.nextInt(...
('rnd',而不是'ran')
2)将final
修饰符添加到photos
和rnd
变量中以解决此问题:
final int[] photos={R.drawable.img1, R.drawable.img2,R.drawable.img3,R.drawable.img4};
3)在图像视图图像上相同:
final ImageView image=(ImageView)findViewById(R.id.imageview1);
答案 2 :(得分:0)
更改
Random rnd=new Random();
到
final Random ran=new Random();
另外,更改
int[] photos=...;
ImageView image=...;
到
final int[] photos=...;
final ImageView image=...;