跑了无法解决

时间:2013-03-02 14:55:21

标签: java

我正在尝试创建一个代码,当我运行一个应用程序时,有一个随机图像,当我点击它时,它显示一个不同的随机图像,但我得到错误,我只有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,无法弄清问题在哪里......

3 个答案:

答案 0 :(得分:4)

1)您已声明变量rnd,但之后您尝试将其称为ran。你需要保持一致。

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

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

答案 1 :(得分:1)

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

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

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=...;