1

我正在尝试编写一个代码,当我运行应用程序时,会有一个随机图像,当我点击它时,它会显示一个不同的随机图像,但我得到错误,我只有 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 “ran 无法解析” ★2 “不能在不同方法定义的内部类中引用非 final 变量 photos” “ran 无法解析” ★3 “不能在 an 内部类中引用 non-final 变量 image在不同方法中定义的内部类”“不能在不同方法中定义的内部类中引用非最终变量照片”

我试过刷新,也做了ctrl+shift+o,不知道问题出在哪里...

4

3 回答 3

4

1)您已经声明了一个变量rnd,但是您试图将其称为ran. 你需要保持一致。

2 和 3) 两者photosrnd都需要声明为final变量,因为您在匿名内部类中使用它们。

在匿名内部类中使用局部变量时,它们是最终的业务基本上是因为匿名内部类的工作方式。基本上,当您构造一个实例时,它将局部变量值传递给匿名内部类的(生成的)构造函数,该构造函数保留这些变量的副本以供以后使用。通过将变量限制为final一个,它避免了变量可以在方法或匿名内部类中更改的情况,而这些更改在其他上下文中看不到。

于 2013-03-02T14:57:27.980 回答
1

1)我猜你的意思是 rnd.nextInt(... ('rnd',而不是'ran')

2)将final修饰符添加到photosandrnd变量以解决此问题:

final int[] photos={R.drawable.img1, R.drawable.img2,R.drawable.img3,R.drawable.img4};

3)在图像视图图像上相同:

final ImageView image=(ImageView)findViewById(R.id.imageview1);
于 2013-03-02T14:58:52.207 回答
0

改变

        Random rnd=new Random();

        final Random ran=new Random();

还有,改变

        int[] photos=...;
        ImageView image=...;

        final int[] photos=...;
        final ImageView image=...;
于 2013-03-02T14:57:15.587 回答