RelativeLayout.getWidth 当布局宽度为 720 时返回 0

RelativeLayout.getWidth returning 0 when layout width is 720

我正在尝试学习 android 的基础知识,当我调用 RelativeLayout.getWidth 时,我得到的值是 0,而不是布局的预期大小。

我有一个 RelativeLayout 填充我的屏幕:

    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:id="@+id/activity_one>
   <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="test"
        android:id="@+id/test"/>
    </RelativeLayout >

但是当我在 oncreate() 中使用下面的代码时,我得到的是 0 而不是预期的屏幕宽度 720。

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_one);

        RelativeLayout rl= (RelativeLayout) findViewById(R.id.activity_one);

        TextView tempTextview = (TextView) findViewById(R.id.test);

        tempTextview.setText("W: " + rl.getWidth() + " - H:" + rl.getHeight());
}

我一定是犯了一个非常愚蠢的错误,但我看不出是什么。

您调用 getWidth() / getHeight() 太早了。 UI 尚未完全布局和调整大小。

如果我没记错的话,布局元素的宽度和高度等变量是在 onCreate() 方法之后设置的。 有一些类似的问题并通过将 height/width 置于应用程序逻辑流程中的不同位置来解决它们

当您的UI加载完成后,您应该在此处获取宽度,然后只能调用布局的宽度。:

@Override
 public void onWindowFocusChanged(boolean hasFocus) {

  super.onWindowFocusChanged(hasFocus);
//paste your code to get your layout params.
 }

在调用 onMeasure 之前不会设置宽度(这是实际测量尺寸并且此方法依次调用 setMeasuredDimension 时)。

您可以获得特定布局的 ViewTreeObserver 对象并实现 ViewTreeObserver.OnDrawListener 并将此实现传递给观察者对象 addOnDrawListener 函数,

获取此观察器实现中的高度和宽度,并根据这些新值更改您想要的任何其他视图项目,这样即使布局高度和宽度将来可能发生变化,一切都保持一致取向改变?

viewTreeObserver 对象中还有许多其他事件,只需找到一个适合您需要的事件并为其编写侦听器即可。这是 ViewTreeObserver http://developer.android.com/reference/android/view/ViewTreeObserver.html

文档的 link