一 背景
UI設計可能會有如題的需求中跌。寫幾個View效果來疊加就顯得繁瑣了咨堤,那怎么辦呢?
二 思路
判斷行數(shù)來設置gravity唄漩符?
先來探索下獲取TextView行數(shù)的結果:
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
看似是符合預期一喘,但是是有特殊情況的。上面的設置高度為wrap_content嗜暴,寬度固定凸克,如果手動設置lines=2呢?
結果發(fā)現(xiàn)原本應該顯示5行的內(nèi)容闷沥,在頁面僅僅顯示兩行萎战,但是但是,行數(shù)結果輸出卻為5舆逃。
如果是少于或等于設定行數(shù)的值蚂维,顯示和輸出的行數(shù)均正常。
@android.view.RemotableViewMethod
public void setLines(int lines) {
mMaximum = mMinimum = lines;
mMaxMode = mMinMode = LINES;
requestLayout();
invalidate();
}
從源碼看路狮,設置lines意味著max和min的lines值一樣了虫啥。
三 解決方案
至于上面在設置lines后輸出行數(shù)值可能異常的情況,因為已經(jīng)能判定為多行了奄妨,所以也沒關系孝鹊。這樣就能做行數(shù)判斷,判斷為一行還是多行時則再去設置gravity展蒂。
如下所示:
binding.textView.apply {
addTextChangedListener {
gravity = if (lineCount > 1) Gravity.START else Gravity.CENTER
}
}
延伸
如果設置固定行數(shù)了又活,譬如為2,則內(nèi)容只有一行和有多行的情況下锰悼,TextView的高度是不是一樣的柳骄?
答:不一樣,一行的高度還是低一些箕般。上面的案例是一行為142耐薯,兩行為157。