前言
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); }
小结
看源码后发现,其实TextView.setWidth()并不是一直无效,是根据xml中的配置而定。
TextView.setHeight()等方法是否有效也是这样,具体看源码中的注释。
参考文章
© 版权声明