前言

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()等方法是否有效也是这样,具体看源码中的注释。

参考文章

相关文章

暂无评论

none
暂无评论...