无意间遇到的TextView的一个坑

今天解bug的时候遇到一个奇怪的问题:listview的item由一个textview和一个imageview组成,父布局是线性水平排列。我的本意是imageview显示相同的图片,textview显示文本,但是运行程序后发现,当某个textview的文本较多时,imageview会被压缩,刚开始没注意,检查代码了好久。代码示例如下:

<!--文本少的item-->
<LinearLayout    
android:id="@+id/ll"    
android:layout_width="match_parent"    android:layout_height="wrap_content"    
android:background="#e6e9ed"    
android:gravity="center_vertical|right">    
<TextView        
android:id="@+id/title"        
android:layout_width="wrap_content"        
android:layout_height="match_parent"        
android:gravity="bottom"        
android:text="我们右边引用的是同一张图片"        
android:textSize="16sp" />
<ImageView        
android:id="@+id/icon"        
android:layout_width="wrap_content"        
android:layout_height="wrap_content"        
android:layout_marginLeft="17dp"        
android:layout_marginRight="23dp"        
android:background="@drawable/test" />
</LinearLayout>


<!--文本多的item-->
<LinearLayout    
android:id="@+id/ll"    
android:layout_width="match_parent"    
android:layout_height="wrap_content"    
android:layout_marginTop="50dp"    
android:background="#e6e9ed"    
android:gravity="center_vertical|right">    
<TextView        
android:id="@+id/title"        
android:layout_width="wrap_content"        
android:layout_height="match_parent"        
android:gravity="bottom"        
android:text="我们右边引用的是同一张图片,我字数多"        
android:textSize="16sp" />
<ImageView        
android:id="@+id/icon"        
android:layout_width="wrap_content"        
android:layout_height="wrap_content"        
android:layout_marginLeft="17dp"        
android:layout_marginRight="23dp"        
android:background="@drawable/test" />
</LinearLayout>

运行效果如下图:

屏幕快照 2016-10-31 下午9.11.59.png

可以发现,第二个布局中,右边图片被“挤扁”了。为什么会出现这种情况?其实很简单,是textview宽度自适应搞的鬼。水平线形布局中,我们虽然设置了imageview与左右的偏移(margin)值,但是由于自布局textview与imageview是按顺序排列的,textview会首先完成它的自适应,导致字数过多的时候会把右边的imageview压缩,此时imageview的左右margin值还是我们设置的。

那么,怎么设置才能让文本框显示较多文字而又不挤压右边的imageview呢?

答案很简单,还是要在textview的宽度上做文章了。只需要: textview的width属性依然设置为:wrap_content自适应,再加上一个权重属性即可:weight="1". 这样,textview就会占据水平剩下的空间,而不会去挤压右边的imageivew了。代码如下:

<LinearLayout    
android:id="@+id/ll"    
android:layout_width="match_parent"    
android:layout_height="wrap_content"    
android:layout_marginTop="50dp"    
android:background="#e6e9ed"    
android:gravity="center_vertical|right">    
<TextView        
android:id="@+id/title"        
android:layout_width="wrap_content"        
android:layout_height="match_parent"        
android:layout_weight="1"        
android:ellipsize="end"        
android:gravity="bottom"        
android:singleLine="true"        
android:text="我们右边引用的是同一张图片,我字数多"        
android:textSize="16sp" />    
<ImageView        
android:id="@+id/icon"        
android:layout_width="wrap_content"        
android:layout_height="wrap_content"        
android:layout_marginLeft="17dp"        
android:layout_marginRight="23dp"        
android:background="@drawable/test" />

运行效果就正常了:

屏幕快照 2016-10-31 下午9.28.48.png

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏python3

习题31:访问列表元素

访问列表中的元素,使用下标的方式,通常以0开始(为什么是0而不是1),这里程序的设计就是如此,个人觉得没有必要纠结,如有兴趣,可自行查看资料

672
来自专栏一场梦

给图片或文字加上鼠标悬浮时旋转动画

1143
来自专栏C/C++基础

Linux命令(3)——sed命令

sed(Stream EDitor)是一种流文件编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern spac...

392
来自专栏菜鸟计划

webpack学习(四)extract-text-webpack-plugin插件

二、extract-text-webpack-plugin插件 从 bundle 中提取文本(CSS)到单独的文件 安装 npm install extract...

3426
来自专栏河湾欢儿的专栏

开发调试工具

常用的开发工具 文本编辑器:(轻量级) sublime notepad++ editplus IDE(集成开发环境 功能强大) webstrom ...

1082
来自专栏波比

$.ajax使用Form提交与Payload提交

Form解析可以直接从Request对象中获取请求参数,这样对象转换与处理相对容易,但在大批JSON数据需要提交时,可能会出现大量的数据拆分与处理工作,另外针对...

1238
来自专栏C/C++基础

Linux命令(39)——du命令

(1)文件大小与占用磁盘空间大小的区别。 文件大小(又名 apparent size)是文件自身实际大小,与占用磁盘空间大小(又名 occupied spa...

661
来自专栏架构之路

Linux wait() 和 waitpid()函数介绍

转载自http://blog.csdn.net/wallwind/article/details/6998602 ---- 当一个进程正常或异常终止的时候,内核...

3275
来自专栏白驹过隙

Redis - list类型操作

33912
来自专栏程序员互动联盟

【高级编程】linux进程间通信总结

1. 概览 本文记录经典的IPC:pipes, FIFOs, message queues, semaphores, and shared memory。 2....

3357

扫码关注云+社区