忙忙忙,每天忙的不想动。吐槽完了,进入主题,项目有一个解决用户输入过长的需求,对应到代码就是TextView过长,一般解决TextView是在XML或者代码中设置maxEms或者maxLength,然而在某些情况下会遇见屏幕适配问题,为了解决这个问题采用动态设置maxEms来解决。
maxEms和maxLength
maxEms和maxLength都是设置文本显示的最大长度,区别在于maxLength度量单位是字符,maxEms的度量单位是ems,表现区别如图:
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
android:lines="1"
// android:maxLength="5"
android:maxEms="5"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
从图中可以看到明显区别,maxLength针对中、英文都是按照字符数进行度量,maxEms是按照ems进行度量
可以看到maxEms对中英文显示出了不一样的效果,主要原因在于ems这个度量单位,ems是个什么东西呢?
em是字体宽度的排版单位,表示字宽的单位。 em字面意思为:equal M (和M字符一致的宽度为一个单位)简称em,ems是em的复数形式。em的大小还有字体有关,不同手机定义不同字体,所以在不同手机上em是有差别的。
动态设置Text的显示长度
在实际开发过程中由于屏幕宽度不一致,可能会导致在宽度较小的屏幕上文本可能会过长,在宽度大的屏幕上文本能显示完全,为了解决这一问题,可以采用动态设置TextView的maxEms的方法,首先获取屏幕宽度,以文本长度乘以行高获得文本显示长度,如果文本显示长度大于屏幕宽度,则屏幕无法显示完全,通过屏幕宽度/行高 获得maxEms的值,具体代码:
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
WindowManager wm = (WindowManager) this
.getSystemService(Context.WINDOW_SERVICE);
int screenWidth = wm.getDefaultDisplay().getWidth();
int length=str.length();
if(length*mTextView.getLineHeight()>screenWidth){
int maxEms=screenWidth/mTextView.getLineHeight();
mTextView.setMaxEms(maxEms);
mTextView.setText(str);
}
}