当一个TextView可以GONE时,我如何将两个TextView集中在一起?

时间:2017-03-23 09:53:26

标签: android xml android-layout

我使用两个TextView来显示联系人姓名和公司名称,一个在另一个下面,使用DataBinding技术。公司名称是可选字段,因此它可以消失。

1。我一直在 item_contact.xml 中使用此方法:

<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
    <import type="android.view.View"/>
    <variable
        name="info"
        type="com.myproject.objects.InfoObject"/>
</data>
<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:minHeight="70dp">

    <TextView
        android:id="@+id/item_contact_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="32dp"
        android:layout_marginStart="32dp"
        android:layout_centerVertical="true"
        android:text='@{info.getAccountName() == null ? info.getName() : String.format(@string/item_meeting_time_period, info.getName(), info.getAccountName() )}'
        android:textSize="16sp"
        android:textColor="@color/black"
        />

    <include layout="@layout/bottom_line_divider" />

</RelativeLayout>
</layout>

的strings.xml

<string name="item_meeting_time_period" translatable="false">%1$s\n%2$s</string>

所以字符串只是一个在另一个之下。但现在我需要更改第二行的textSizetextColor。在这种情况下,我需要使用两个TextView,我使用的当前解决方案是以LinearLayout为中心。

2。带有两个TextView的第二个解决方案。

我的 item_contact.xml

<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
    <import type="android.view.View"/>
    <variable
        name="info"
        type="com.myproject.objects.InfoObject"/>
</data>
<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:minHeight="70dp">

<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerVertical="true"
    android:orientation="vertical"
    >

<TextView
    android:id="@+id/item_contact_name"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="32dp"
    android:layout_marginStart="32dp"
    android:text="@{info.getName()}"
    android:textSize="16sp"
    android:textColor="@color/black"
    />

<TextView
    android:id="@+id/item_contact_accountName"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="32dp"
    android:layout_marginStart="32dp"
    android:layout_marginTop="5dp"
    android:text="@{info.getAccountName()}"
    android:textColor="@color/gray"
    android:textSize="12sp"            
    android:textAppearance="@android:style/TextAppearance.DeviceDefault.Widget.ActionMode.Subtitle"
    android:visibility="@{info.getAccountName().isEmpty() ? View.GONE : View.VISIBLE}"
    android:background="@color/blue"
    />

</LinearLayout>

    <include layout="@layout/bottom_line_divider" />

</RelativeLayout>

但是在这种情况下,如果第二个TextViewGone,那么第一个TextView仍将呈现在LinearLayout的顶部,因为它假设第二个视图可以是{{1 }}

问题:如果第二个TextView不可见,并且如果第二个TextView可见,那么将第一个TextView垂直集中在一起是什么解决方案?

4 个答案:

答案 0 :(得分:2)

使用android:gravity。这将使容器内的孩子对齐。

<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:orientation="vertical"
android:gravity="center_vertical"
>

答案 1 :(得分:0)

这是使用ConstraintView的完美案例。 它对“缺失”观点的支持要好得多。

答案 2 :(得分:0)

尝试使用此

    <TextView
    android:id="@+id/item_contact_name"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="32dp"
    android:layout_marginStart="32dp"
    android:text="@{info.getName()}"
    android:textSize="16sp"
    android:gravity="center_vertical"
    android:textColor="@color/black" />

希望这会有所帮助。

答案 3 :(得分:0)

好的,总结一下。最后,我完成了所有操作并且它按照我的意愿工作,所以如果只有一个TextView可见,那么它是集中的verticaticaly,或者如果TextView两个都可见,则它们都是居中的。

item_contact.xml

<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
    <import type="android.view.View"/>
    <variable
        name="info"
        type="fi.lunni.mobileadvisor.ui.objects.InfoObject"/>
    <variable
        name="handler"
        type="fi.lunni.mobileadvisor.ui.adapters.ContactsAdapter"/>
</data>
<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:minHeight="70dp">

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:orientation="vertical"
        android:gravity="center_vertical"
        >

        <TextView
            android:id="@+id/item_contact_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="32dp"
            android:layout_marginStart="32dp"
            android:text="@{info.getName()}"
            android:textSize="16sp"
            android:textColor="@color/black"
            android:layout_gravity="@{info.getAccountName().length() > 0 }"
            />

        <TextView
            android:id="@+id/item_contact_accountName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="32dp"
            android:layout_marginStart="32dp"
            android:layout_marginTop="5dp"
            android:text="@{info.getAccountName()}"
            android:textColor="@color/gray"
            android:textSize="12sp"
            android:textAppearance="@android:style/TextAppearance.DeviceDefault.Widget.ActionMode.Subtitle"
            android:visibility="@{info.getAccountName().length() > 0 ?  View.VISIBLE : View.GONE }"
            />

    </LinearLayout>

    <include layout="@layout/bottom_line_divider" />

</RelativeLayout>

一个单独的类中的函数 BindingAdapters.java

@BindingAdapter("android:layout_gravity")
public static void setLayoutGravity(TextView view, boolean belowViewExists){
    if(view.getId() == R.id.item_contact_name){
        Log.d(TAG, "setLayoutVertical() " + belowViewExists);
        if(!belowViewExists) {
            final LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams)
                    view.getLayoutParams();
            layoutParams.gravity = Gravity.CENTER_VERTICAL;
            layoutParams.height = WindowManager.LayoutParams.MATCH_PARENT;
            view.setLayoutParams(layoutParams);
        }
    }
}