将getX()和getY()视图添加到Activity后,返回0.0

cyd*_*den 20 android android-layout

在ManActivity onCreate()中,我实例化了一个新视图,并通过layout.addView将其添加到活动中.如果我为该视图尝试getX()或getY(),我总是得到0.0.

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'
Run Code Online (Sandbox Code Playgroud)

Tan*_*.7x 30

ViewGroup例如,RelativeLayout不要立即布置他们的孩子,因此你的View还不知道它将在屏幕上的位置.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);
        }
    });
Run Code Online (Sandbox Code Playgroud)


小智 12

另一种选择是使用post(Runnable action)方法:

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

这将导致在完成其他待处理任务(例如布局)之后执行Runnable.