我有一个RelativeLayout和六个元素,如果数字为空,可以“隐藏”(View.GONE),以节省空间。当某个值变空时,我隐藏该数字和该数字的“标题”。所有元素在屏幕上混合,如下图所示:
这是代码:
<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
,突然条目找不到其下方的视图,并且默认情况下将自身一直向左对齐。
我理解你为什么要这样做,因为“Mobile”是最长的字符串,并且你希望它们与“Mobile”开始的位置对齐,但这不是一个可靠的方法。 例如,本地化可能会使“Mobile”不再是最短的字符串,并破坏您的逻辑。
当我制作与此类似的布局时,我通常最终会将元素放在右列中
layout_alignParentLeft="true"
,然后在其上放置一个大的左边距。 但这并不能完全实现您正在寻找的“根据右列中最大元素的宽度向左对齐”行为。 我认为 T.M 的 TableLayout 走在正确的轨道上,尽管我自己还没有充分使用它们来了解具体细节。
可能会发生这种情况,因为当视图为
GONE
时,就好像它尚未加载并且您正在使用 layoutBelow
属性。
这可能不是您问题的确切答案,但实现此目的的另一种方法是使用
TableLayout
,然后在运行时删除TableRow
。
使用 view.setVisibility(View.INVISIBLE) 而不是 GONE
android:layout_alignWithParentIfMissing="true"