【问题标题】:How to display android view class and widgets in xml如何在 xml 中显示 android 视图类和小部件
【发布时间】:2016-01-28 15:46:12
【问题描述】:

我正在尝试在屏幕顶部显示一个扩展 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>

【问题讨论】:

  • 也许 myview.wrap_content 填满了整个屏幕,这就是问题所在?如何设置 MyView 的视图高度?
  • 我没有设置 MyView 的高度,它的构造函数是这样定义的 public MyView(Context context, AttributeSet attr) { super(context, attr);} 并且它覆盖了 onDraw(Canvas canvas)
  • 抱歉回复晚了,我也试过把layout_height改成match_parent和fill_parent,还是没有显示下面的小部件
  • 您是否尝试过将父外部布局设置为垂直线性布局,而不是为此使用相对布局?
  • 我只是做了,没有任何变化

标签: android xml layout view


【解决方案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
measure pass 设置视图应该有多大,它的尺寸,layout pass 设置放置视图的位置,它的位置。

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

因此,如果您将CustomView 放在LinearLayout 下方,那么它可以正常工作。但是您的视图将位于布局下方,根据您的布局需求,这是不希望的。

<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 的权限。在你的情况下,整个屏幕都被遗漏了。

希望对你有帮助。

【讨论】:

  • 感谢 Pavitra 的富有洞察力的回应,它运行良好。
  • 很高兴为您提供帮助@user1420482
猜你喜欢
  • 1970-01-01
  • 2011-09-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多