我想在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:
rl_title是我的标题布局
svtest是我的中间(身体)内容。
rl_music_controller是我的页脚布局。
我指的是this link。但我不明白我到底做了什么?
答案 0 :(得分:11)
当布局宽度和高度设置为已添加:这适用于所有类型的布局。不仅是ScrollView。
getWidth()
和getHeight()
时, match_parent
和wrap_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();
}