无意间遇到的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 条评论
登录 后参与评论

相关文章

来自专栏用户2442861的专栏

PyCharm常用快捷键

Ctrl + NumPad+/- 展开或者收缩代码块 Ctrl + Shift + NumPad+ 展开所有的代码块 Ctrl + Shift + NumPa...

2501
来自专栏无原型不设计

在 Mockplus 设置页面链接,实现页面交互

在Mockplus中,可以轻松设置页面链接,方法有二:   一、直接拖拽 1 点击某个组件,此时组件上方出现小工具栏。 2 拖拽(点击后不放手)小工具栏...

2957
来自专栏我爱编程

PyCharm

1914
来自专栏happyJared

IDEA快捷键拆解系列(十五):经验篇

  本文整理了一些博主本人在学习工作中比较常用到的快捷键,有需要的可以参考一下,也欢迎留言补充。

2421
来自专栏vue学习

小程序 — 小程序生命周期及页面生命周期

(1)首先小程序的生命周期函数是在app.js里面调用的,App(Object)函数用来注册一个小程序。接受一个 Object 参数,指定其小程序的生命周期回调...

1322
来自专栏搞前端的李蚊子

微信小程序监听input输入并取值

小程序的事件分为两种,冒泡和非冒泡事件,像<form/>的submit事件,<input/>的input事件,<scroll-view/>的scroll事件等非...

4757
来自专栏Android干货

小程序实践(九):返回到上一个界面并传值回去

常见需求,修改某个信息,需要调到一个新界面有个输入框去修改内容,修改之后,点击后退按钮,新的数据就返回更新了

2043
来自专栏专业duilib使用+业余界面开发

duilib中获取的控件的位置或者大小不对的可能的原因

2564
来自专栏每日一篇技术文章

weex-27-通用事件

如上示例中定义的单击事件方法tap中,如果不传递参数,即使用默认参数的情况,系统会自动传递如下对象当成方法的参数

1293
来自专栏Spring相关

Vue中webpack的Style的lang和Scoped属性

修改goods.vue中的style我们会发现到goods的时候回影响到其他的div样式,添加scoped作用域可以解决这个问题,如下:

2692

扫码关注云+社区

领取腾讯云代金券