Hint 是我们在 EditText 中常用的属性,它可以帮我们传达一些提示信息给用户,比如直观地告诉用户该 EditText 应该填写什么内容,或者应该符合什么格式等。

当然,有时候我们想要修改 Hint 的属性,来使界面更加友好,但实际上你会发现,Hint 默认属性可供我们修改的值并不多,这时候我们得想办法曲线救国。

Hint 的字体颜色

Hint 的默认颜色是灰色,具体值是多少我没有去了解,但有时候我们想修改 Hint 的颜色,Android 为我们提供了方法,我们可以直接调用属性来设置:

<EditText
    ...
    android:textColorHint="@color/colorAccent" />

也可以在逻辑代码中动态设置:

editText.setHintTextColor(getResources().getColor(R.color.colorAccent));

Hint 的字体大小

Hint 的默认字体大小是跟随 EditText 的 TextSize 的,因此只需要设置 EditText 的字体大小即可。

<EditText
    ...
    android:textSize="32sp" />

这也是最符合交互的一种写法。

当然,你也可能会遇到特别的需求,比如仅修改 Hint 的字体大小,而不修改 EditText 中用户键入的内容的字体大小,怎么办呢?

public void setEditTextHintTextSize(EditText editText, String hint, int hintTextSize) {
    SpannableString spannableString = new SpannableString(hint);
    AbsoluteSizeSpan absoluteSizeSpan = new AbsoluteSizeSpan(hintTextSize, true);
    spannableString.setSpan(absoluteSizeSpan, 0, spannableString.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    editText.setHint(new SpannableString(spannableString));
}

我把它封装成一个方法,传入需要设置的 EditText、要显示的 Hint 内容和 Hint 的字体大小值。

首先新建一个可以添加属性的文本对象 SpannableString,然后再建一个属性对象 AbsoluteSizeSpan 来设置文本的字体大小,该对象传入两个参数进行初始化,第一个就是文本字体大小,单位是 px,但是众所周知,Android 开发中很少会使用 px 来衡量尺寸,因为它描述的屏幕上的物理像素,而由于各家手机使用的屏幕差异,在不同手机上显示的大小也各不相同,所以 Android 中常用 dp 来衡量距离,而用 sp 来衡量字体,因此在这里用 px 来衡量字体明显是不合理的,所以第二个参数用来确认是否使用 dip 作为衡量单位,dip 实际上也就是 dp,当该参数为 TRUE 时就表示使用 dip 作为衡量单位,不设置的话默认为 FALSE,也就是使用 px 作为衡量单位,所以我们一般都会将它设置为 TRUE,即使如此,dp 仍然不是一个衡量字体大小的好单位,详情可以参考『Android 中各尺寸单位的区别』一文。

接下来就是调用 SpannableStringsetSpan() 方法,这个方法的参数在『Android 改变 TextView 内局部样式』中已经有了详细的介绍。最后就调用 EditTextsetHint() 方法将这个文本对象设置进去,这里再次创建了一个 SpannableString 对象,实际上直接使用上方原有的 SpannableString 对象也是可以设置成功的,但是看到网上的技术博客中提到一定要进行转换,否则属性可能会消失,我暂未遇到属性消失的情况,所以可以自行斟酌。