我正在创建一个应用程序,它会在x轴上随机显示一个对象,但不知怎的,我的应用程序在启动时崩溃了。
当我使用 DisplayMetrics 时它会起作用,但它会获得整个屏幕的宽度。我想获得 LAYOUT 的宽度。但是当我尝试检索布局宽度并设置随机位置时,应用程序在启动时崩溃
我感觉 TIMER 在检索 LAYOUT WIDTH 之前就开始了。这就是崩溃的原因
这是代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
frame = (RelativeLayout) findViewById(R.id.frame);
screenWidth = frame.getWidth();
r = new Random();
timer.schedule(new TimerTask() {
@Override
public void run() {
handler.post(new Runnable() {
@Override
public void run() {
goDown();
}
});
}
}, 0, 20);
//FUNCTIONS FOR IT TO GO DOWN
public void goDown() {
//LAYOUT WIDTH
frameWidth = screenWidth;
//DISPLAYING RANDOM X POSITION
newXposition = r.nextInt(frameWidth);
//SKULLS FUNCTIONS
skullY += skullSpeed;
if(skullY > frameHeight)
{
skullY = -100.0f;
skullX = newXposition - skull.getWidth();
}
skull.setX(skullX);
skull.setY(skullY);
}
这是我的LOGCAT:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.gin.myapplication, PID: 8786
java.lang.IllegalArgumentException: n <= 0: 0
at java.util.Random.nextInt(Random.java:182)
at com.example.gin.myapplication.MainActivity.goDown(MainActivity.java:91)
at com.example.gin.myapplication.MainActivity$1$1.run(MainActivity.java:74)
提前感谢您的帮助! :d
答案 0 :(得分:1)
在Android中,视图会在稍后阶段绘制。在此之前,视图尺寸的任何getter方法都返回零。在读取其值之前,您需要等待在屏幕上绘制视图。 你可以用两种方式做到这一点
在viewtreeobserver中添加布局侦听器
frame.getViewTreeObserver().addOnGlobalLayoutListener(new
ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
frame.getViewTreeObserver().removeOnGlobalLayoutListener(this);
screenWidth = frame.getHeight(); //height is ready
}
});
附加Post Runnable
frame.post(new Runnable() {
@Override
public void run() {
screenWidth = frame.getHeight(); //height is ready
}
});