2015-09-04 8 views
14

に追加されたgetX()およびgetY()を返します。新しいViewをインスタンス化し、layout.addView経由でアクティビティに追加しました。私はそのビューのgetX()またはgetY()しようとすると、私は常に0.0を取得します。このようRelativeLayoutとしてManActivity onCreate()のアクティビティ

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    RelativeLayout main = (RelativeLayout)findViewById(R.id.main); 

    RelativeLayout.LayoutParams squarePosition = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); 
    GameToken square1 = new GameToken(this,GameToken.SQUARE, fieldHeight,fieldWidth); 
    squarePosition.addRule(RelativeLayout.ALIGN_PARENT_LEFT); 
    squarePosition.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); 
    main.addView(square1, squarePosition); 
    System.out.println(square1.getX()); //Prints '0.0' 
    System.out.println(square1.getY()); //Prints '0.0' 

答えて

21

ViewGroup sが、すぐに自分の子供をレイアウトしていない、それが画面上に存在する場所そのため、あなたのビューはまだ知りません。レイアウトパスが完了するまでにRelativeLayoutが完了するまで待つ必要があります。

あなたがそうのような世界的なレイアウトイベントをリッスンすることができます

view.getViewTreeObserver().addOnGlobalLayoutListener(
    new ViewTreeObserver.OnGlobalLayoutListener() { 
     @Override 
     public void onGlobalLayout() { 
      // Layout has happened here. 

      // Don't forget to remove your listener when you are done with it. 
      view.getViewTreeObserver().removeOnGlobalLayoutListener(this); 
     } 
    }); 
+0

これは、perfactly、非常にありがとうございます:) – cyden

1
onWindowFocusChanged()コールバックへのgetX()とgetY()表示にあなたの呼び出しを移動し

。 公式ガイドによれば、これはユーザーにアクティビティが表示されているかどうかを確認する最も良い方法です。あなたのコードを見ると、両方のコールバックでそれを使用できるように、メンバー変数に四角形を置くことができます。

これを試してみてください:

GameToken mSquare1 = new GameToken(this,GameToken.SQUARE, fieldHeight,fieldWidth); 

    ... 
    @Override 
    public void onWindowFocusChanged(boolean hasFocus) { 

      super.onWindowFocusChanged(hasFocus); 

      if(hasFocus) { 
      System.out.println(mSquare1.getX()); 
      System.out.println(mSquare1.getY()); 
      } 
    } 

一般的なルールは、あなたがそれを作成しているとAndroidはまだそれらを詳しく説明する必要があるので、あなたが、のonCreate()内のレイアウトから位置情報を取得することができないということです。

あなたはonResume()コールバックにチャンスを与えることもできますが、私にとってはうまくいきませんでした。

view.post(new Runnable() { 
    @Override 
    public void run() { 
     System.out.println(view.getX()); 
     System.out.println(view.getY()); 
    } 
}); 

これはRunnableをは(例えばレイアウトなど)他の保留中のタスクが終了した後に実行されるようになります:

4

別のオプションはpost(Runnable action)メソッドを使用することです。

関連する問題