RelativeLayout 和 View.GONE 问题(混合元素)

RelativeLayout and View.GONE issue (mixed elements)

我有一个RelativeLayout和六个元素可以"hide"(View.GONE)如果一个数字为空,为了节省space。当某个值变空时,我会隐藏该数字和该数字的 "title"。所有元素在屏幕上混合,如您在此图像中所见:

这是代码:

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_below="@+id/largeImageView"
    android:id="@+id/containerLayout"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="@string/phone"
        android:id="@+id/phoneTitleTextView"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_marginTop="20dp" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="Text"
        android:id="@+id/homePhoneTextView"
        android:layout_below="@+id/phoneTitleTextView"
        android:layout_alignParentLeft="true" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="@string/home"
        android:id="@+id/homeTitleTextView"
        android:layout_below="@+id/phoneTitleTextView"
        android:layout_alignLeft="@+id/workTitleTextView"
        android:layout_alignStart="@+id/workTitleTextView" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="Text"
        android:id="@+id/workPhoneTextView"
        android:layout_below="@+id/homePhoneTextView"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="@string/work"
        android:id="@+id/workTitleTextView"
        android:layout_below="@+id/homeTitleTextView"
        android:layout_alignLeft="@+id/mobileTitleTextView"
        android:layout_alignStart="@+id/mobileTitleTextView" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="Text"
        android:id="@+id/mobilePhoneTextView"
        android:layout_below="@+id/workPhoneTextView"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="@string/mobile"
        android:id="@+id/mobileTitleTextView"
        android:layout_alignTop="@+id/mobilePhoneTextView"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true" />
</RelativeLayout>

我想我应该使用 LinearLayout,但是当我尝试它们时它变得最糟糕。 提前致谢!

这可能会发生,因为当视图为 GONE 时,就好像它尚未加载并且您正在使用 layoutBelow 属性。

这可能不是您问题的确切答案,但另一种方法是 use TableLayout and then remove the TableRow at runtime

问题在于右列中的每个条目都取决于其下方的条目来确定其左对齐。如果你将底部一行,甚至中间一行设置为 GONE,突然条目找不到它下面的视图,默认情况下一直向左对齐。

我理解你为什么要这样做,因为 "Mobile" 是最长的字符串,你希望它们与 "Mobile" 开始的位置对齐,但这不是一个可靠的方法。例如,本地化可能会使 "Mobile" 不再是最短的字符串,并破坏您的逻辑。

当我制作与此类似的布局时,我通常会在右栏 layout_alignParentLeft="true" 中放置元素,然后在其上留出较大的左边距。但这并不能完全实现您正在寻找的 "aligned left based on the width of largest element in right column" 行为。我认为 T.M 使用 TableLayout 是正确的,尽管我自己使用它们的次数还不够多,无法深入了解细节。

使用 view.setVisibility(View.INVISIBLE) 而不是 GONE