2017-09-13 84 views
0

我正在创建一个应用程序,它会在x轴上随机显示一个对象,但不知何故,我的应用程序在启动时崩溃。在x轴上设置对象的随机位置

它适用于我使用DisplayMetrics,但它获得整个屏幕的宽度。我想要获得宽度布局。但在启动应用程序崩溃,当我尝试检索布局宽度,并设置一个随机位置

我有一种感觉,面前的TIMER开始可以检索版式宽度。这就是为什么它崩溃

这是代码:

@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

你在哪里调用仓库()? – Elinor

+0

@Elinor对不起,我忘了改变这一点。它真的是失败了。 haha –

回答

1

在Android中,视图绘制在更晚的阶段。在此之前,视图维度的任何getter方法都会返回零。在读取其值之前,您需要等待视图在屏幕上绘制。 你可以做到这一点有两种方式

添加布局听者viewtreeobserver

frame.getViewTreeObserver().addOnGlobalLayoutListener(new 
ViewTreeObserver.OnGlobalLayoutListener() { 
     @Override 
     public void onGlobalLayout() { 
      frame.getViewTreeObserver().removeOnGlobalLayoutListener(this); 
      screenWidth = frame.getHeight(); //height is ready 
     } 
    }); 

安装后可运行

frame.post(new Runnable() { 
     @Override 
     public void run() { 
      screenWidth = frame.getHeight(); //height is ready 
     } 
    }); 
+0

我使用了布局侦听器,并在布局侦听器中添加了定时器。由于计时器将运行并且布局宽度的值尚未检索,计时器引发了问题。哈哈。谢谢您的帮助! –

+0

注意:您可以通过使用frame.postDelayed()方法完全消除计时器 – Aalin

+0

注意到夫人/先生,再次感谢:D –