Android: Get the size of the Body Layout Dynamical

2019-02-15 05:40发布

I want to get the height/width of the Middle(Body) layout in onCreate() method.

My main.xml is :

<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>

I am adding Textview dynamically in TableLayout. id :

  1. rl_title is my title layout

  2. svtest is my Middle(Body) Content.

  3. rl_music_controller is my footer layout.

I am referring this link. But i don't understand exactly what i do?

3条回答
forever°为你锁心
2楼-- · 2019-02-15 05:51

Firstly, don't get view dimensions in onCreate() since the view might not have been initialized yet. You can do it in the onStart() method. All the views will have been inflated and laid out on the screen at that point:

@Override
    protected void onStart() {
        super.onStart();
        ScrollView scrollView = (ScrollView) findViewById(R.id.svtest);
        int width = scrollView.getWidth();
        int height = scrollView.getHeight();
    }
查看更多
戒情不戒烟
3楼-- · 2019-02-15 05:52

Added: This applies for all types of layout. Not only ScrollView.

getWidth() and getHeight() methods returns 0 when layouts width and height are set as match_parent and wrap_content. dimensions are not measured.

The right methods to use to get measured dimensions are getMeasuredWidth() and getMeasuredHeight().

Note: measured dimensions in onCreate method are not initialized yet.

The correct way and place is (snippet can be added anywhere including 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.
    } 
});

Some answers tried to do it onStart() method. but, they tried to call getWidth() and getHeight() methods. Try getMeasuredWidth() and getMeasuredHeight(). it works without adding OnGlobalLayoutListener. The listener is only required if you want to get the dimensions in the on create method. in any later stage the listener is not required because by then the dimensions will be measured(on start for example).

查看更多
Fickle 薄情
4楼-- · 2019-02-15 06:05

I find overriding the following method prevents the width and height being 0. At this stage of the Activity all of the View's in the Activity should be inflated.

public void onWindowFocusChanged (boolean hasFocus)
{
     super.onWindowFocusChanged(hasFocus);
     ScrollView scrollView = (ScrollView) findViewById(R.id.svtest);
     int width = scrollView.getWidth();
     int height = scrollView.getHeight();
}
查看更多
登录 后发表回答