Java 无法引用在封闭范围中定义的非最终局部变量按钮,随机方法错误
我在使用eclipse的项目中遇到错误:Java 无法引用在封闭范围中定义的非最终局部变量按钮,随机方法错误,java,android,eclipse,button,random,Java,Android,Eclipse,Button,Random,我在使用eclipse的项目中遇到错误: Cannot refer to the non-final local variable button defined in an enclosing scope 这是我的班级: import android.app.Activity; import android.content.Context; import android.graphics.Point; import android.os.Bundle; import android.suppo
Cannot refer to the non-final local variable button defined in an enclosing scope
这是我的班级:
import android.app.Activity;
import android.content.Context;
import android.graphics.Point;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.widget.Button;
import android.view.Menu;
import android.view.MenuItem;
import android.view.WindowManager;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
public class MainActivity extends Activity {
Button buttonblack;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
buttonblack = (Button)findViewById(R.id.Button01);
startRandomButton(buttonblack);
}
public static Point getDisplaySize(@NonNull Context context) {
Point point = new Point();
WindowManager manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
manager.getDefaultDisplay().getSize(point);
return point;
}
private void setButtonRandomPosition(Button button){
int randomX = new Random().nextInt(getDisplaySize(this).x);
int randomY = new Random().nextInt(getDisplaySize(this).y);
button.setX(randomX);
button.setY(randomY);
}
private void startRandomButton(Button button) {
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
setButtonRandomPosition(button);
}
}, 0, 1000);//Update button every second
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
问题在于这种方法:
private void startRandomButton(Button button) {
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
setButtonRandomPosition(button);// Cannot refer to the non-final local variable button defined in an enclosing scope
}
}, 0, 1000);//Update button every second
}
有人能帮我修一下吗?或者建议其他比这更好的代码?将您的代码更改为
私有void startRandomButton(最终按钮)
。编译器希望确保引用没有在匿名类的方法中重新分配
在java-8中,如果您的引用实际上是final,那么您甚至不必将这些参数标记为final,因为您已经声明了
按钮black代码>在main活动中全局执行
您可以像这样传递buttonblack
setButtonRandomPosition(buttonblack)代码>而不将其称为最终版
谢谢您的帮助!但是应用程序是强制关闭的,你能再帮我一次吗?在我的新岗位上