TextView过长解决

忙忙忙,每天忙的不想动。吐槽完了,进入主题,项目有一个解决用户输入过长的需求,对应到代码就是TextView过长,一般解决TextView是在XML或者代码中设置maxEms或者maxLength,然而在某些情况下会遇见屏幕适配问题,为了解决这个问题采用动态设置maxEms来解决。

maxEms和maxLength

maxEms和maxLength都是设置文本显示的最大长度,区别在于maxLength度量单位是字符,maxEms的度量单位是ems,表现区别如图:


maxLength=5

maxEms=5
    <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进行度量

maxLength=5中文文本

maxEms=5中文文本

可以看到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);
        }

    }

推荐阅读更多精彩内容