0

我试图获得textView使用getTop()getLeft()方法的位置,但它们总是返回 0。我从 onCreate() 调用此方法

    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    TextView textView = (TextView) findViewById(R.id.hello);

    int top = textView.getLeft();
    int left = textView.getLeft();
    int height = textView.getHeight();

    Log.i("top", "top = " + top);
    Log.i("left", "left = " + left);
    Log.i("height", "height = " + height);
4

3 回答 3

2

我找到了答案。只需使用getViewTreeObserver().addOnGlobalLayoutListener并在此方法中调用 getLeft、getTop 等。

于 2012-11-16T13:51:20.613 回答
2

布局传递完成后,将触发布局侦听器。它与特定的活动生命周期无关,因此您必须将观察者添加到布局过程中。

    view.getViewTreeObserver().addOnGlobalLayoutListener(
            new ViewTreeObserver.OnGlobalLayoutListener()
            {
                @Override
                public void onGlobalLayout()
                {
                    // Now you may get the left/top/etc. 
                    getCoordsFromView(view);
                    // Optionally remove the listener so future layouts don't change the value
                    view.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                }
            });
于 2014-06-10T19:21:18.273 回答
1

此时文本视图尚不可见。您需要在活动的生命周期中稍后调用它们(请参阅下面的文档)。

引用生命周期文档

一旦 onCreate() 完成执行,系统会快速连续调用 onStart() 和 onResume() 方法。您的活动永远不会处于 Created 或 Started 状态。从技术上讲, 当调用 onStart() 时,活动对用户可见,但 onResume() 很快就会出现,并且活动保持在 Resumed 状态,直到发生某些事情来改变它

一些图像

于 2012-11-16T09:40:04.890 回答