Android:动态获取Body Layout的大小

时间:2013-07-09 07:02:45

标签: android layout

我想在onCreate()方法中获取Middle(Body)布局的高度/宽度。

我的main.xml是:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/rl_Main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/main_bg11" >

<RelativeLayout
    android:id="@+id/rl_title"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true" >

    <include layout="@layout/title" />
</RelativeLayout>

<ScrollView
    android:id="@+id/svtest"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_above="@+id/rl_music_controller"
    android:layout_below="@+id/rl_title" >

    <RelativeLayout
        android:id="@+id/rl12"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center" >

        <TableLayout
            android:id="@+id/tbl_vandana"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_centerHorizontal="true"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:gravity="center_horizontal"
            android:paddingTop="30dp" >
        </TableLayout>
    </RelativeLayout>
</ScrollView>

<RelativeLayout
    android:id="@+id/rl_music_controller"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true" >

    <include layout="@layout/controller" />
</RelativeLayout>

我在TableLayout中动态添加Textview。 id:

  1. rl_title是我的标题布局

  2. svtest是我的中间(身体)内容。

  3. rl_music_controller是我的页脚布局。

  4. 我指的是this link。但我不明白我到底做了什么?

3 个答案:

答案 0 :(得分:11)

  

已添加:这适用于所有类型的布局。不仅是ScrollView。

当布局宽度和高度设置为getWidth()getHeight()时,

match_parentwrap_content方法返回0。尺寸未测量。

用于获取测量尺寸的正确方法是getMeasuredWidth()getMeasuredHeight()

  

注意: onCreate方法中的测量尺寸尚未初始化。

正确的方式和地点是(代码段可以添加到任何地方,包括onCreate):

ScrollView scrollView = (ScrollView)findViewById(R.id.svtest);
ViewTreeObserver vto = scrollView.getViewTreeObserver(); 
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
    @Override 
    public void onGlobalLayout() { 
        if (Build.VERSION.SDK_INT < 16)
            scrollView.getViewTreeObserver().removeGlobalOnLayoutListener(listener);
        else
            scrollView.getViewTreeObserver().removeOnGlobalLayoutListener(listener);

        int width  = scrollView.getMeasuredWidth();
        int height = scrollView.getMeasuredHeight(); 

        // postpone any calculation depend on it to here.
        // regardless what it is. UI or http connection.
    } 
});

一些答案​​试图在onStart()方法上做到这一点。但是,他们试图调用getWidth()getHeight()方法。试试getMeasuredWidth()getMeasuredHeight()。它可以在不添加OnGlobalLayoutListener的情况下工作。只有在想要在on create方法中获取维度时才需要监听器。在任何后期阶段,都不需要监听器,因为那时将测量尺寸(例如,在开始时)。

答案 1 :(得分:1)

首先,不要在onCreate()中获取视图尺寸,因为视图可能尚未初始化。您可以使用onStart()方法执行此操作。此时所有观点都会在屏幕上膨胀并显示:

@Override
    protected void onStart() {
        super.onStart();
        ScrollView scrollView = (ScrollView) findViewById(R.id.svtest);
        int width = scrollView.getWidth();
        int height = scrollView.getHeight();
    }

答案 2 :(得分:0)

我发现覆盖以下方法可以防止宽度和高度为0.在活动的这个阶段,活动中的所有视图都应该膨胀。

public void onWindowFocusChanged (boolean hasFocus)
{
     super.onWindowFocusChanged(hasFocus);
     ScrollView scrollView = (ScrollView) findViewById(R.id.svtest);
     int width = scrollView.getWidth();
     int height = scrollView.getHeight();
}