TextView.setWidth()竟然失效了

Android  小知识  2024年6月27日 pm7:04发布5个月前更新 城堡大人
93 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、 本站名称: 笔友城堡
2、 本站网址: https://www.biumall.com/
3、 本站部分文章来源于网络,仅供学习与参考,如有侵权,请留言

暂无评论

暂无评论...

随机推荐

SharedPreferences最后一次写入时断电偶尔存在不保存问题

前言最近测试反馈,播放音乐的信息断电时偶尔不记忆。项目中的记忆是使用sharedpreferences的,sharedpreferences是以xml文件保存,保存的位置在:/data/data/[包名]/shared_prefs测试反馈的关键字[断电]、[偶尔]和[不记忆],也就是说这...

Android图片旋转

前言Android对图片进行旋转记录。于Y轴往里面旋转。具体效果如图记录于此,方便自己查阅。正文直接上代码就是对ImageView的封装<com.biumall.reflectview.view.RotateView   android:id="@+id/main_rev...

使用sqlite3命令

前言调试机器中大部分是带有sqlite3模块的,当然是一般而言啦,有些厂商不会让用户去操作这个的。本文摘抄部分sqlite3的操作命令,方便自己查阅。正文这里以Android 13中MediaProvider的数据库操作为例。进入sqlite3的操作界面进入adb shell# 进...

Android 8.0后音频焦点处理小结

前提两个或两个以上的 Android 应用可同时向同一输出流播放音频,系统会将所有音频流混合在一起。为了避免所有音乐应用同时播放,Android 引入了“音频焦点”的概念。一次只能有一个应用获得音频焦点。音频焦点采用合作模式对,合作模式,你可以准守也可以不准守。Android建议应用遵守...

朱自清:冬天

说起冬天,忽然想到豆腐。是一“小洋锅”(铝锅)白煮豆腐,热腾腾的。水滚着,像好些鱼眼睛,一小块一小块豆腐养在里面,嫩而滑,仿佛反穿的白狐大衣。锅在“洋炉子”(煤油不打气炉)上,和炉子都熏得乌黑乌黑,越显出豆腐的白。这是晚上,屋子老了,虽点着“洋灯”,也还是阴暗。围着桌子坐的是父亲跟我们哥儿三个。“洋...

Android Intent匹配及mimeType匹配

前言activity的启动分为显式调用和隐式调用。显式调用需要明确指定组件的信息。隐式调用是通过匹配目标组件的IntentFilter这里是记录一下如何使用匹配目标组建隐式启动Activity正文通过组建匹配,可以再不知道应用包名的情况启动对应的Activity(或者说应用),一个...