一 背景
UI設(shè)計(jì)可能會有如題的需求。寫幾個(gè)View效果來疊加就顯得繁瑣了,那怎么辦呢?
二 思路
判斷行數(shù)來設(shè)置gravity唄?
先來探索下獲取TextView行數(shù)的結(jié)果:
fun setTwoLine(view: View) {
Log.d(TAG,"setTwoLine")
binding.textView.text = "這是很多內(nèi)容這是很多內(nèi)容這是很多內(nèi)容這是很多內(nèi)容"
printTextViewLine()
}
fun setTwoLineByN(view: View) {
binding.textView.text = "這是很多\n內(nèi)容"
printTextViewLine()
}
fun setMultiLine(view: View) {
binding.textView.text = "這是很多內(nèi)容這是很多內(nèi)容這是很多內(nèi)容這是很多內(nèi)容很多內(nèi)容很多內(nèi)容很多內(nèi)容很多內(nèi)容很多內(nèi)容很多內(nèi)容很多內(nèi)容"
printTextViewLine()
}
輸出:
行數(shù)為->2
行數(shù)為->2
行數(shù)為->5
看似是符合預(yù)期,但是是有特殊情況的。上面的設(shè)置高度為wrap_content,寬度固定,如果手動設(shè)置lines=2呢?
結(jié)果發(fā)現(xiàn)原本應(yīng)該顯示5行的內(nèi)容,在頁面僅僅顯示兩行,但是但是,行數(shù)結(jié)果輸出卻為5。
如果是少于或等于設(shè)定行數(shù)的值,顯示和輸出的行數(shù)均正常。
@android.view.RemotableViewMethod
public void setLines(int lines) {
mMaximum = mMinimum = lines;
mMaxMode = mMinMode = LINES;
requestLayout();
invalidate();
}
從源碼看,設(shè)置lines意味著max和min的lines值一樣了。
三 解決方案
至于上面在設(shè)置lines后輸出行數(shù)值可能異常的情況,因?yàn)橐呀?jīng)能判定為多行了,所以也沒關(guān)系。這樣就能做行數(shù)判斷,判斷為一行還是多行時(shí)則再去設(shè)置gravity。
如下所示:
binding.textView.apply {
addTextChangedListener {
gravity = if (lineCount > 1) Gravity.START else Gravity.CENTER
}
}
延伸
如果設(shè)置固定行數(shù)了,譬如為2,則內(nèi)容只有一行和有多行的情況下,TextView的高度是不是一樣的?
答:不一樣,一行的高度還是低一些。上面的案例是一行為142,兩行為157。