我使用两个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>
所以字符串只是一个在另一个之下。但现在我需要更改第二行的textSize
和textColor
。在这种情况下,我需要使用两个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>
但是在这种情况下,如果第二个TextView
是Gone
,那么第一个TextView仍将呈现在LinearLayout
的顶部,因为它假设第二个视图可以是{{1 }}
问题:如果第二个TextView不可见,并且如果第二个TextView可见,那么将第一个TextView垂直集中在一起是什么解决方案?
答案 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);
}
}
}