如何在xml中显示android视图类和小部件

时间:2015-10-28 18:01:19

标签: android xml layout view

我正在尝试显示一个类,它在屏幕顶部扩展了View,在xml布局中显示了两个texviews和下面的按钮,但是只显示了没有下面按钮的视图,或者下面的视图和按钮显示如果我将视图高度硬编码为400dp,任何帮助都会非常感激,

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:custom="http://schemas.android.com/apk/res-auto"
 android:id="@+id/rl"
 android:layout_width="match_parent"
 android:layout_height="match_parent">


 <view class="....MyView"
    android:id="@+id/myView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" //"400dp"
    />

 <LinearLayout
    android:id="@+id/graphCntrls"
    android:orientation="horizontal"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@id/myView"
    >

    <TextView
        android:id="@+id/tvXCoord"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@android:color/black"
        android:text="x coordinate"/>

    <TextView
        android:id="@+id/tvYCoord"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@android:color/black"
        android:text="y coordinate"/>

    <Button
        android:id="@+id/coordsCalcBttn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@android:color/black"
        android:text="Calc" />

</LinearLayout>

</RelativeLayout>

1 个答案:

答案 0 :(得分:1)

CustomView的默认大小为0.除非它有子视图(并且是从定义onLayout的布局类派生的),在这种情况下,默认大小是其子项的总和。

如果您想在不仅包含子视图集合的自定义视图上使用wrap_content,则需要覆盖onLayout()和/或onMeasure()

以下是解决方法:

<xml version="1.0" encoding="utf-8"?>
<LinearLayout
    android:id="@+id/rl"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >

    <com.droid.pmk.stackoverflow1.MyView
        android:id="@+id/myView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:background="#ccc"
        />

    <LinearLayout
        android:id="@+id/graphCntrls"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/myView"
        android:orientation="vertical"
        >

        <TextView
            android:id="@+id/tvXCoord"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="x coordinate"
            android:textColor="@android:color/black"/>

        <TextView
            android:id="@+id/tvYCoord"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="y coordinate"
            android:textColor="@android:color/black"/>

        <Button
            android:id="@+id/coordsCalcBttn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Calc"
            android:textColor="@android:color/black"/>

    </LinearLayout>

</LinearLayout>

如果要在自定义视图中更改View的默认行为,则需要覆盖onMeasure。因此,测量CustomView是布局过程的一部分,其中包括两个主要步骤:measuring and layouting 度量过程设置视图的大小,视图的大小,以及布局过程设置视图的位置,视图的位置。

布局部分仅对有孩子的视图感兴趣,换句话说,继承自ViewGroup的视图。

因此,如果您将CustomView置于LinearLayout之下,那么它可以正常运行。但是您的View将位于布局之下,根据您的布局需求,这是不受欢迎的。

<RelativeLayout
    android:id="@+id/rl"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp">

    <LinearLayout
        android:id="@+id/graphCntrls"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        >

        <TextView
            android:id="@+id/tvXCoord"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="x coordinate"
            android:textColor="@android:color/black"/>

        <TextView
            android:id="@+id/tvYCoord"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="y coordinate"
            android:textColor="@android:color/black"/>

        <Button
            android:id="@+id/coordsCalcBttn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Calc"
            android:textColor="@android:color/black"/>

    </LinearLayout>


    <com.droid.pmk.stackoverflow1.MyView
        android:id="@+id/myView"
        android:layout_width="wrap_content"
        android:layout_height="0px"
        android:layout_below="@id/graphCntrls"
        android:background="#ccc"
        />


</RelativeLayout>

这表明wrap_content将授予您MyView根据需要获取尽可能多的RelativeLayout的权限。在你的情况下,整个屏幕都是左边的。

我希望它有所帮助。