Android布局:组动态元素

问题描述:

我有图像和文本元素的视图。其中一些是动态的,所以我想将它们分组在一个“容器”(线性布局也许?)中,所以当它们中的一些不存在时,下面的元素可以具有20dp的余量,而不是大的空白。Android布局:组动态元素

这是布局:

image layout

我的代码: (我想组:phoneTitleTextView,homePhoneTextView和homeTitleTextView)

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:paddingBottom="@dimen/activity_vertical_margin" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 


    <ImageView 
     android:id="@+id/largeImageView" 
     android:layout_width="120dp" 
     android:layout_height="120dp" 
     android:scaleType="centerCrop" /> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textAppearance="?android:attr/textAppearanceMedium" 
     android:text="@string/name" 
     android:id="@+id/contactTitleTextView" 
     android:layout_toRightOf="@+id/largeImageView" 
     android:layout_alignParentTop="true" 
     android:layout_marginLeft="10dp" /> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textAppearance="?android:attr/textAppearanceLarge" 
     android:text="Text" 
     android:id="@+id/contactNameTextView" 
     android:layout_below="@+id/contactTitleTextView" 
     android:layout_toRightOf="@+id/largeImageView" 
     android:layout_toEndOf="@+id/largeImageView" 
     android:layout_marginLeft="10dp"/> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textAppearance="?android:attr/textAppearanceMedium" 
     android:text="@string/company" 
     android:id="@+id/companyTitleTextView" 
     android:layout_above="@+id/companyTextView" 
     android:layout_alignLeft="@+id/contactNameTextView" /> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textAppearance="?android:attr/textAppearanceLarge" 
     android:text="Text" 
     android:id="@+id/companyTextView" 
     android:layout_alignBottom="@+id/largeImageView" 
     android:layout_alignLeft="@+id/contactNameTextView" 
     android:layout_alignStart="@+id/contactNameTextView" /> 

    <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_below="@+id/largeImageView" 
     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_alignTop="@+id/homePhoneTextView" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentEnd="true" /> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textAppearance="?android:attr/textAppearanceMedium" 
     android:text="@string/address" 
     android:id="@+id/addressTitleTextView" 
     android:layout_below="@+id/homePhoneTextView" 
     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/address1TextView" 
     android:layout_below="@+id/addressTitleTextView" 
     android:layout_alignParentLeft="true" 
     /> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textAppearance="?android:attr/textAppearanceLarge" 
     android:text="Text" 
     android:id="@+id/address2TextView" 
     android:layout_below="@+id/address1TextView" 
     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/birthday" 
     android:id="@+id/birthdayTitleTextView" 
     android:layout_below="@+id/address2TextView" 
     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/birthdayTextView" 
     android:layout_below="@+id/birthdayTitleTextView" 
     android:layout_alignParentLeft="true" /> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textAppearance="?android:attr/textAppearanceMedium" 
     android:text="@string/email" 
     android:id="@+id/emailTitleTextView" 
     android:layout_below="@+id/birthdayTextView" 
     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/emailTextView" 
     android:layout_below="@+id/emailTitleTextView" 
     android:layout_alignParentLeft="true" /> 

    <ImageView 
     android:id="@+id/starImageView" 
     android:layout_width="50dp" 
     android:layout_height="50dp" 
     android:scaleType="centerCrop" 
     android:layout_alignTop="@+id/contactTitleTextView" 
     android:layout_alignRight="@+id/homeTitleTextView" 
     android:layout_alignEnd="@+id/homeTitleTextView" /> 
</RelativeLayout> 

当我尝试用RelativeLayout的做我所有的元素混合在一起。

提前致谢!

+0

你提到了linearlayout,你试过了吗? – wanpanman

使用RelativeLayout您必须指定每个视图相对到另一个的位置。例如,放置phone_02_title下面phone_01_title您将使用属性below这样的:

<RelativeLayout 
    ...> 

    <TextView 
     android:id="@+id/phone_01_title" 
     ... 
     /> 

    <TextView 
     android:id="@+id/phone_02_title" 
     android:layout_below="@+id/phone_01_title" 
     ... 
     /> 

    ... 

</RelativeLayout> 

无论如何,如果你想要的是设置“电话”和“地址”组之间的缘,我建议你使用android:paddingBottom="" 。这会在列表下方放置一个空格,而与组的行数无关。

如果你想为缺少的视图留下一个“空闲空间”(假设你有2/5个电话),我宁愿为容器和行设置一个固定的高度。例如,每个TextView的高度为40dp,容器的容量为200dp(5x40dp)。

最后但并非最不重要的一点,如果您知道它们将介于1到5之间,我还建议您对视图使用“setVisibility”,而不是动态添加它们。在XML布局中设置所有5个视图,然后,以编程方式使用view.setVisibility(View.VISIBLE)view.setVisibility(View.INVISIBLE)来显示/隐藏它们的内容(但不是它们的高度)。

希望这可以帮助你!

+1

谢谢!解决了我的问题,并感谢SetVisibility的建议,我会使用它! – emboole

+1

非常高兴我可以帮助:) – josemigallas