Android自定义视图完全忽略布局参数im xml,并且在整个屏幕上延伸

时间:2010-12-15 17:43:52

标签: android view android-layout

我正在使用具有背景图片的自定义视图,用于在其上绘制内容。

此视图忽略了 android:layout_width =“wrap_content android:layout_height =”wrap_content ,它没有包装背景图片并且正在拉伸和推动控件屏幕外的视图。

自定义视图位于主要的LinearLayout中,但无论我放在哪里,它的行为都是一样的。

我尝试使用 setLayoutParams ,但是在可见控件下物理尺寸在某种程度上仍然是相同的,并且由于我保存其他时间的坐标,因此尺寸很重要。它甚至出现在自定义标题下,并且坐标作为底片返回,这也是一个问题。

由于屏幕尺寸不同,我不喜欢静态设置尺寸的想法。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent" 
android:layout_height="wrap_content">

<org.danizmax.tradar.MapView
android:id="@+id/mapView" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content"
/>

<!-- koordinate -->
<LinearLayout android:id="@+id/controls"
android:orientation="horizontal"
android:layout_width="fill_parent" 
android:layout_height="fill_parent"
android:paddingLeft="10sp"
android:paddingRight="10sp">

    <TextView android:id="@+id/coordsText" 
    android:layout_width="wrap_content" 
    android:layout_height="fill_parent"
    android:textStyle="bold"
    android:textSize="15sp"
    android:gravity="center"
    android:layout_weight="1">
    </TextView>

</LinearLayout>

<!-- radij -->
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent" 
android:layout_height="wrap_content"
android:paddingBottom="10sp"
android:paddingLeft="-5sp"
android:paddingRight="-5sp">
    <Button android:text="" 
        android:id="@+id/ButtonInc"
        android:background="@drawable/leftbuttonani"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content"
        android:layout_weight="1">
        </Button>
    <TextView android:id="@+id/radiusSize" 
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent"
        android:textStyle="bold"
        android:textSize="16sp"
        android:gravity="center"
        android:layout_weight="1"
        android:paddingLeft="0sp"
        android:paddingRight="0sp">
        </TextView>
    <Button android:text="" 
        android:id="@+id/ButtonDec"
        android:background="@drawable/rightbuttonani"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content"
        android:layout_weight="1">
        </Button>
</LinearLayout>

<!-- alert togle -->
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent" 
android:layout_height="wrap_content"
android:paddingLeft="-5sp"
android:paddingRight="-5sp">
    <Button android:text="" 
        android:id="@+id/ButtonDec"
        android:background="@drawable/buttonani"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content"
        android:layout_weight="1">
        </Button>
    <ToggleButton
        android:id="@+id/toggleAlert"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content"
        android:textColor="#D8D8D8"
        android:background="@drawable/buttonani"
        android:textOn="@string/alertOn"
        android:textOff="@string/alertOff"
        android:textStyle="bold"
        android:layout_weight="0.5"
        android:paddingTop="1sp">
        </ToggleButton>
    <Button android:text="" 
        android:id="@+id/ButtonDec"
        android:background="@drawable/buttonani"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content"
        android:layout_weight="1">
        </Button>
</LinearLayout>

<!-- izpis zadnjega dogodka -->
<TextView android:id="@+id/timeStatText" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content"
android:textStyle="bold"
android:textSize="10sp"
android:gravity="center">
</TextView>

它应该是这样的,蓝色部分是 MapView

alt text

任何想法?

1 个答案:

答案 0 :(得分:3)

通过覆盖onMeasure()来解决问题:

    @Override
    protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec){
       super.onMeasure(widthMeasureSpec, heightMeasureSpec);

       int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
       int parentHeight = MeasureSpec.getSize(heightMeasureSpec);
       if(parentWidth<parentHeight){
           this.setMeasuredDimension(parentWidth, (int)(parentWidth*(float)factor));
       }else{
           this.setMeasuredDimension((int)(parentHeight/(float)factor), parentHeight);
       }
    }

找到了更详细的答案HERE