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

问题描述 投票:0回答:4

我有一个RelativeLayout和六个元素,如果数字为空,可以“隐藏”(View.GONE),以节省空间。当某个值变空时,我隐藏该数字和该数字的“标题”。所有元素在屏幕上混合,如下图所示: image

这是代码:

<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,但是当我尝试它们时,情况变得最糟糕。 预先感谢!

android android-linearlayout android-relativelayout
4个回答
0
投票

问题在于右列中的每个条目取决于其下方的条目来确定其左对齐。 如果您将底行,甚至中间的一行设置为

GONE
,突然条目找不到其下方的视图,并且默认情况下将自身一直向左对齐。

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

当我制作与此类似的布局时,我通常最终会将元素放在右列中

layout_alignParentLeft="true"
,然后在其上放置一个大的左边距。 但这并不能完全实现您正在寻找的“根据右列中最大元素的宽度向左对齐”行为。 我认为 T.M 的 TableLayout 走在正确的轨道上,尽管我自己还没有充分使用它们来了解具体细节。


0
投票

可能会发生这种情况,因为当视图为

GONE
时,就好像它尚未加载并且您正在使用
layoutBelow
属性。

这可能不是您问题的确切答案,但实现此目的的另一种方法是使用

TableLayout
,然后在运行时删除
TableRow


0
投票

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


0
投票
android:layout_alignWithParentIfMissing="true"
© www.soinside.com 2019 - 2024. All rights reserved.