忙忙忙,每天忙的不想動(dòng)。吐槽完了蝉衣,進(jìn)入主題,項(xiàng)目有一個(gè)解決用戶輸入過(guò)長(zhǎng)的需求巷蚪,對(duì)應(yīng)到代碼就是TextView過(guò)長(zhǎng)病毡,一般解決TextView是在XML或者代碼中設(shè)置maxEms或者maxLength,然而在某些情況下會(huì)遇見(jiàn)屏幕適配問(wèn)題屁柏,為了解決這個(gè)問(wèn)題采用動(dòng)態(tài)設(shè)置maxEms來(lái)解決啦膜。
maxEms和maxLength
maxEms和maxLength都是設(shè)置文本顯示的最大長(zhǎng)度有送,區(qū)別在于maxLength度量單位是字符,maxEms的度量單位是ems僧家,表現(xiàn)區(qū)別如圖:
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" />
從圖中可以看到明顯區(qū)別雀摘,maxLength針對(duì)中、英文都是按照字符數(shù)進(jìn)行度量八拱,maxEms是按照ems進(jìn)行度量
maxLength=5中文文本
maxEms=5中文文本
可以看到maxEms對(duì)中英文顯示出了不一樣的效果阵赠,主要原因在于ems這個(gè)度量單位,ems是個(gè)什么東西呢肌稻?
em是字體寬度的排版單位,表示字寬的單位清蚀。 em字面意思為:equal M (和M字符一致的寬度為一個(gè)單位)簡(jiǎn)稱em,ems是em的復(fù)數(shù)形式灯萍。em的大小還有字體有關(guān)轧铁,不同手機(jī)定義不同字體,所以在不同手機(jī)上em是有差別的旦棉。
動(dòng)態(tài)設(shè)置Text的顯示長(zhǎng)度
在實(shí)際開發(fā)過(guò)程中由于屏幕寬度不一致,可能會(huì)導(dǎo)致在寬度較小的屏幕上文本可能會(huì)過(guò)長(zhǎng)药薯,在寬度大的屏幕上文本能顯示完全绑洛,為了解決這一問(wèn)題,可以采用動(dòng)態(tài)設(shè)置TextView的maxEms的方法童本,首先獲取屏幕寬度真屯,以文本長(zhǎng)度乘以行高獲得文本顯示長(zhǎng)度,如果文本顯示長(zhǎng)度大于屏幕寬度穷娱,則屏幕無(wú)法顯示完全绑蔫,通過(guò)屏幕寬度/行高 獲得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);
}
}