TextView.setWidth()竟然失效了

Android  小知识  2024年6月27日 pm7:04发布4个月前更新 91es.com站长
52 0 0

前言

TextView.setWidth()失效(无作用),其实好奇,既然没作用,为啥要预留这个方法呢?

记录一下,方便自己查阅。

正文

既然要刨根问底,就需要看源码TextView。

看了一下源码TextView.setWidth()

//[来自谷歌翻译]
//将 TextView 的宽度设置为精确的像素宽度。
//如果 LayoutParams 不强制 TextView 具有精确的宽度,则此值用于宽度计算。
//设置此值将覆盖之前的最小/最大宽度配置,例如 setMinWidth(int) 或 setMaxWidth(int)。
@android.view.RemotableViewMethod
public void setWidth(int pixels) {
    mMaxWidth = mMinWidth = pixels;
    mMaxWidthMode = mMinWidthMode = PIXELS;
    requestLayout();
    invalidate();
}

哈哈,看了源码就会发现,是否有效,具体看TextView的xml配置。重点在:

如果 LayoutParams 不强制 TextView 具有精确的宽度,则此值用于宽度计算。

下面单独对有效和无效就行介绍。

有效xml配置

<TextView
    android:id="@+id/play_tv_time"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textColor="@android:color/white"
    android:textSize="20sp" />

或者

<TextView
    android:id="@+id/play_tv_time"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textColor="@android:color/white"
    android:textSize="20sp" />

此时对TextView设置setWidth()是有效的

mTvTime = mRootView.findViewById(R.id.play_tv_time);
//这里是直接设置了100
mTvTime.setWidth(100);

//不是很推荐上面方式,可以考虑下面的
//int width = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 100, getResources().getDisplayMetrics());
mTvTime.setWidth(width);

也就是android:layout_width=""中的配置不要固定精确值,此时Java中setWidth()是有效的。

无效xml配置

<TextView
    android:id="@+id/play_tv_time"
    android:layout_width="80dp"
    android:layout_height="wrap_content"
    android:textColor="@android:color/white"
    android:textSize="20sp" />

此时对TextView设置setWidth()是无效的

既然无效,那如何解决呢,下面也展示解决的方法。

private void updateViewWidth(TextView textView, int width) {
    if (null == textView || width < 0) {
        return;
    }
    ViewGroup.LayoutParams layoutParams = textView.getLayoutParams();
    layoutParams.width = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, width, getResources().getDisplayMetrics());
    textView.setLayoutParams(layoutParams);
}

小结

  1. 看源码后发现,其实TextView.setWidth()并不是一直无效,是根据xml中的配置而定。

  2. TextView.setHeight()等方法是否有效也是这样,具体看源码中的注释。

参考文章

 历史上的今天

  1. 2023: JNI静态注册(0条评论)
  2. 2021: Android的apk组成结构(0条评论)
  3. 2021: 席慕容:独白(0条评论)
  4. 2021: 嫣然若雪:余生,看淡所有,珍惜拥有(0条评论)
  5. 2020: Android的LevelListDrawable简单使用(0条评论)
版权声明 1、 本站名称: 91易搜
2、 本站网址: 91es.com3xcn.com
3、 本站内容: 部分来源于网络,仅供学习和参考,若侵权请留言
3、 本站申明: 个人流水账日记,内容并不保证有效

暂无评论

暂无评论...

随机推荐

MediaScanner源码分析

前言上一篇《MediaProvider源码分析》分析到,正在对多媒体的扫描是在MediaScanner中,因此进入就进一步分析多媒体扫描逻辑。这里是用了Android P源码分析,只能是个人流水账哈涉及代码目录#javaframeworks\base\media\java\andro...

汪曾祺:端午的鸭蛋

家乡的端午,很多风俗和外地一样。系百索子。五色的丝线拧成小绳,系在手腕上。丝线是掉色的,洗脸时沾了水,手腕上就印得红一道绿一道的。做香角子。丝线缠成小粽子,里头装了香面,一个一个串起来,挂在帐钩上。贴五毒。红纸剪成五毒,贴在门槛上。贴符。这符是城隍庙送来的。城隍庙的老道士还是我的寄名干爹,他每年端午...

三毛:故乡人

我们是替朋友的太太去上坟的。朋友坐轮椅,到了墓园的大门口,汽车便不能开进去,我得先将朋友的轮椅从车厢内拖出来,打开,再用力将他移上椅子,然后慢慢的推着他。他的膝上放着一大束血红的玫瑰花,一边讲着闲话,一边往露斯的墓穴走去。那时荷西在奈及利亚工作,我一个人住在岛上。我的朋友尼哥拉斯死了妻子,每隔...

叔本华:比读书更重要的是什么

不管任何藏书丰富的图书馆,假如不加整顿杂乱无章的话,它给予我们的利益还不如那些规模小藏书少,但整理得条理井然、分类清楚的图书馆,同理,不管你学识如何的渊博,如若不能反复思维咀嚼消化的话,它的价值,远逊于那些所知不多但能予以深思熟虑的知识。何以言之?因为我们若要将所学得的知识消化吸收,变为己有,并且能...

林徽因:笑

笑的是她的眼睛,口唇,和唇边浑圆的旋涡。艳丽如同露珠,朵朵的笑向贝齿的闪光里躲。那是笑——神的笑,美的笑;水的映影,风的轻歌。 笑的是她惺松的鬈发,散乱的挨着她的耳朵。轻软如同花影,痒痒的甜蜜涌进了你的心窝。那是笑——诗的笑,画的笑:云的留痕,浪的柔波。选自《...

Date常用格式转换

前言记录一下,Date常用格式的转换。记录于此,方便自己查阅。好记性不如烂笔头正文Date对象# 创建date对象Date date = new Date();# 获取当前时间Date date = new Date(System.currentTimeMillis());当...