Android 当一个文本视图消失时,如何将两个文本视图居中?

Android 当一个文本视图消失时,如何将两个文本视图居中?,android,xml,android-layout,Android,Xml,Android Layout,我使用了两个TextViews来显示联系人姓名和公司名称,使用数据绑定技术一个接一个地显示。公司名称是可选字段,因此它可以消失 1.我一直在item\u contact.xml中使用这种方法: <layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <import type="android.view.View"/> <variable

我使用了两个
TextView
s来显示联系人姓名和公司名称,使用数据绑定技术一个接一个地显示。公司名称是可选字段,因此它可以消失

1.我一直在item\u 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>
<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>
<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>
@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);
        }
    }
}
但是在这种情况下,如果第二个
文本视图
消失了,第一个文本视图仍将呈现在
线性布局的顶部
,因为它假设第二个视图可以
可见


问题:如果第二个TextView不可见,如何使第一个TextView垂直集中;如果第二个TextView可见,如何使这两个TextView都集中?

这是一个完美的使用案例。
它对“缺少”视图的支持要好得多。

这是一个很好的使用案例。
它对“缺失”视图的支持要好得多。

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

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

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

<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:gravity="center_vertical"
    android:textColor="@color/black" />

希望这能有所帮助。

试着用这个

    <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" />


希望这有帮助。

好的,总结一下。最后,我已经完成了所有工作,并且它按照我的要求工作,因此,如果只有一个
TextView
可见,那么它就是集中式垂直视图,或者如果两个
TextView
s可见,那么它们都是居中的

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>
<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>
<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>
@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);
        }
    }
}

好的,总结一下。最后,我已经完成了所有工作,并且它按照我的要求工作,因此,如果只有一个
TextView
可见,那么它就是集中式垂直视图,或者如果两个
TextView
s可见,那么它们都是居中的

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>
<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>
<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>
@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);
        }
    }
}

不幸的是,这没有帮助。我想这是因为我正在使用数据绑定。不幸的是,它没有帮助。我想这是因为我在使用数据绑定。