Android中layout_align****和setPadding方法整合

原创 2015年10月20日 21:01:05

转载请注明出处:http://blog.csdn.net/u012975705/article/details/49282835

前言

最近在项目中遇到一个问题,要求显示下面的效果。
这里写图片描述

这里写图片描述

如图所示,“所属农庄”必须紧挨在“商品名字”后面,但当商品名字过长时必须使得所属农庄显示完整,并且商品名字中显示不全的部分使用省略号,开始一直没弄出来,后面想到用layout_align****,才成功实现其效果。
其他不说,先来来看看layout_align**** 的用法。

layout_align**** 介绍

layout_align**** 是RelativeLayout布局中子控件所拥有的一个用来帮助确定显示位置属性。align翻译过来为对齐,所以layout_align**** 即为与某某对其,先看例子:

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/shop_item_name"
        style="@style/TextNormal"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:singleLine="true"
        android:ellipsize="end"
        android:text="商品名字商品名字" />

    <TextView
        android:layout_alignRight="@id/shop_item_name"
        android:layout_alignBaseline="@id/shop_item_name"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:gravity="center_vertical"
        android:text="所属农庄"
        android:textColor="@color/red"
        android:textSize="@dimen/typeface_micro_12" />
</RelativeLayout>

显示效果:
这里写图片描述

其中

layout_alignRight="@id/shop_item_name"

表示与id=shop_item_name的控件又对齐,即“所属农庄”的右边缘与“商品名字”的右边缘重合。

layout_align** ="@id/shop_item_name"

顾名思义,是该两个控件的** 边重合。
当然RelativeLayout中还有些比较特别的控件,
比如

android:layout_alignBaseline="@id/shop_item_name"

表示“所属农庄”控件中的文字与“商品名字”控件中的文字的下边对齐;
比如

android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"

分别表示与该控件的父控件的左、上、右、下边缘对齐

效果实现具体方式

上面代码中的实现效果
这里写图片描述

明显不符合要求,想要实现符合要求的布局必须在控件“商品名字”中添加代码:

android:paddingRight="控件'所属农场'的长度"

其中padding** 即该控件中的内容距该控件** 边缘的距离
完整代码如下:

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/shop_item_name"
        style="@style/TextNormal"
        android:paddingRight="控件'所属农场'的长度"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:singleLine="true"
        android:ellipsize="end"
        android:text="商品名字" />

    <TextView
        android:layout_alignRight="@id/shop_item_name"
        android:layout_alignBaseline="@id/shop_item_name"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:gravity="center_vertical"
        android:text="所属农庄"
        android:textColor="@color/red"
        android:textSize="@dimen/typeface_micro_12" />
</RelativeLayout>

实现效果:
这里写图片描述

下面介绍其中涉及到的怎么动态获取控件的长度和动态设置控件的padding值
1、动态获取控件长度
在获取控件高宽的时候不能直接在代码中使用

int width = holder.mTvName.getWidth();

来获取,因为只有在measure方法被调用之后才能获取到控件的真实长度,所以必须通过利用ViewTreeObserver 监听来获取控件高宽。使用方式如下:

ViewTreeObserver vto = holder.mTvName.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
     @Override
     public void onGlobalLayout() {
                holder.mTvName.getViewTreeObserver().removeGlobalOnLayoutListener(this);
                int width = holder.mTvName.getWidth();
            }
        });

2、在代码中设置控件的padding

holder.shopName.setPadding(left, top, right, bottom);

设置控件中内容距离控件左、上、右、下边缘的距离,单位为px

完整代码:

ViewTreeObserver vto = holder.mTvName.getViewTreeObserver();
        vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                holder.mTvName.getViewTreeObserver().removeGlobalOnLayoutListener(this);
                int width = holder.mTvName.getWidth();
                holder.shopName.setPadding(0, 0, width + 5, 0);
            }
        });
版权声明:本文为博主原创文章,转载请注明出处。博客首页:http://blog.csdn.net/u012975705。订阅:http://blog.csdn.net/u012975705/rss/list https://blog.csdn.net/u012975705/article/details/49282835

Android RelativeLayout padding 的一个坑?

使用RelativeLayout的padding top属性时,发现的一个坑。
  • dahaohan
  • dahaohan
  • 2016-10-26 11:35:28
  • 1771

Android 动态设置padding跟margin的问题

最近要做到动态设置padding跟margin,设置它们四个参数都是int类型。比如这里设置了10,,可是这个数又是代表什么意思呢?一直很好奇它们的单位问题,所以这就造成了,在不同手机上的适配问题。有...
  • qq_30552993
  • qq_30552993
  • 2017-06-07 12:33:10
  • 3762

android:layout_alignleft layout_toleftof 使用,详解RelativeLayout布局属性 ,搜索xm布局

首先把常用的布局分组。(会对所有的对其方式解释,且主要讨论layout_alignleft layout_toleftof区别) android:layout_above ...
  • a2241076850
  • a2241076850
  • 2017-03-15 20:37:33
  • 358

对android:textAlignmentStyle 属性参数的理解

Constant Value Description inherit 0 Default gravity 1 Default for the root view. Th...
  • yihonglvyu1
  • yihonglvyu1
  • 2016-11-24 15:55:12
  • 3300

相对布局的layout_alignLeft属性

相对布局部分属性
  • player_android
  • player_android
  • 2015-10-25 14:20:21
  • 3751

Android中RelativeLayout各个属性 android:layout_alignParentLeft="true"找不到有时候

android:layout_above="@id/xxx"  --将控件置于给定ID控件之上 android:layout_below="@id/xxx"  --将控件置于给定ID控件之下 ...
  • chenaini119
  • chenaini119
  • 2014-03-13 20:45:51
  • 1990

Android中RelativeLayout各个属性 android:layout_alignParentLeft=”true”找不到有时候

android:layout_above="@id/xxx"  --将控件置于给定ID控件之上 android:layout_below="@id/xxx"  --将控件置于给定ID控件之下 ...
  • yy_451686712
  • yy_451686712
  • 2015-04-16 17:39:45
  • 4906

android:layout_alignleft layout_toleftof区别,详解RelativeLayout布局属性

转载请注明博客地址。 最近看博客看到有关于RelativeLayout布局的解释,有的解释很多是错误的。因此有必要对每一个常见的布局属性进行描述。以下解释全部都是逐行进行测试的。 首先把常用...
  • qq_32059827
  • qq_32059827
  • 2016-05-24 13:22:03
  • 7193

android:layout_alignleft layout_toleftof区别详解

对每一个常见的布局属性进行描述。以下解释全部都是逐行进行测试的。首先把常用的布局分组。(会对所有的对其方式解释,且主要讨论layout_alignleft layout_toleftof区别) ...
  • m0_37087802
  • m0_37087802
  • 2017-09-12 10:29:32
  • 179

动态设置Relative Layout中按钮的layout_align_parent_right属性

你可以使用View.getLayoutParams从代码中访问 LayoutParams。你只需要知道你访问的什么LayoutParams。这通常是通过检查包含的ViewGroup就能知道。如果它有一...
  • HarryWeasley
  • HarryWeasley
  • 2015-08-14 16:34:13
  • 2180
收藏助手
不良信息举报
您举报文章:Android中layout_align****和setPadding方法整合
举报原因:
原因补充:

(最多只允许输入30个字)