有这样一种需求
限定一行展示商品名称和商品的价格。当商品名称过长时,价格则有可能显示不下。
需求是:商品价格展示第一优先,商品名称text则填充剩余位置。
那么这样写肯定不行的,需要在代码中动态修改商品text的大小
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:maxLines="1"
android:ellipsize="end"
android:text="榴莲香雪新鲜榴莲生日蛋糕"
/>
<TextView
android:id="@+id/tv_item_price"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:maxLines="1"
android:text="¥43.0"
android:paddingLeft="@dimen/dp_17"
/>
</LinearLayout>
实现方式:给名称和价格的text都添加布局改变时的监听, addOnGlobalLayoutListener。
当在一个视图树中全局布局发生改变或者视图树中的某个视图的可视状态发生改变时,会触发该回调。
tvItemName.getViewTreeObserver().addOnGlobalLayoutListener(skuTitleLayoutListener);
tvItemPrice.getViewTreeObserver().addOnGlobalLayoutListener(skuTitleLayoutListener);
tvItemName.getViewTreeObserver().addOnGlobalLayoutListener(skuTitleLayoutListener);
tvItemPrice.getViewTreeObserver().addOnGlobalLayoutListener(skuTitleLayoutListener);
/**
* 调整名称和价格的位置,以价格优先展示完整,名称以缩略形式展示
*/
private ViewTreeObserver.OnGlobalLayoutListener skuTitleLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener() {
int maxLines = 0;
int children = 0;
View textName;
View textPrice;
int marginLeft = 17;
@Override
public void onGlobalLayout() {
children = 0;
//获取左边对齐留出的距离
if (context != null) {
marginLeft = (int) context.getResources().getDimension(R.dimen.dp_17);
float dm = DeviceUtil.getDensityFromDevice(context);
marginLeft = (int) (dm * marginLeft);
} else {
marginLeft = (int) (marginLeft * 1.5);
}
//计算留给名称和价格展示的长度
maxLines = (llSkuTitle.getWidth() - marginLeft);
for (int i = 0; i < llSkuTitle.getChildCount(); i++) {
//获取名称text占据的宽度
View view = llSkuTitle.getChildAt(i);
children += view.getWidth();
if (i == 0) {
textName = view;
} else {
textPrice = view;
}
}
//判断子view的总长度是否超过最大长度,若超过,则重新调整,限定名称text的宽度
if (children > maxLines) {
int width = maxLines - textPrice.getWidth();
LinearLayout.LayoutParams textNameParams = new LinearLayout.LayoutParams(
width, LinearLayout.LayoutParams.WRAP_CONTENT);
textName.setLayoutParams(textNameParams);
LinearLayout.LayoutParams textPriceParams = new LinearLayout.LayoutParams(LinearLayout.
LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
textPrice.setLayoutParams(textPriceParams);
}
}
};
移除监听,需适配版本
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
tvItemPrice.getViewTreeObserver().removeOnGlobalLayoutListener(skuTitleLayoutListener);
tvItemName.getViewTreeObserver().removeOnGlobalLayoutListener(skuTitleLayoutListener);
} else {
tvItemPrice.getViewTreeObserver().removeGlobalOnLayoutListener(skuTitleLayoutListener);
tvItemName.getViewTreeObserver().removeGlobalOnLayoutListener(skuTitleLayoutListener);
}