TextView的setLines, setMinLines, setMaxLines, setSingleLine四個方法在平常的混合使用中氮兵,容易造成與我們預(yù)期結(jié)果不同的表現(xiàn)疫赎。其具體原因還是要看源碼:
public void setLines(int lines) {
mMaximum = mMinimum = lines;
mMaxMode = mMinMode = LINES;
requestLayout();
invalidate();
}
public void setMaxLines(int maxlines) {
mMaximum = maxlines;
mMaxMode = LINES;
requestLayout();
invalidate();
}
public void setMinLines(int minlines) {
mMinimum = minlines;
mMinMode = LINES;
requestLayout();
invalidate();
}
public void setSingleLine(boolean singleLine) {
// Could be used, but may break backward compatibility.
// if (mSingleLine == singleLine) return;
setInputTypeSingleLine(singleLine);
applySingleLine(singleLine, true, true);
}
private void applySingleLine(boolean singleLine, boolean applyTransformation,
boolean changeMaxLines) {
mSingleLine = singleLine;
if (singleLine) {
setLines(1);
setHorizontallyScrolling(true);
if (applyTransformation) {
setTransformationMethod(SingleLineTransformationMethod.getInstance());
}
} else {
if (changeMaxLines) {
setMaxLines(Integer.MAX_VALUE);
}
setHorizontallyScrolling(false);
if (applyTransformation) {
setTransformationMethod(null);
}
}
}
從源碼中可以看出样刷,實際上主要控制顯示結(jié)果(行數(shù)和可見行數(shù))的是mMaximum肖油,mMinimum,singleLine這三個變量来氧,由makeNewLayout和makeSingleLayout(makeSingleLayout方法主要與Ellipsize的走馬燈模式相關(guān))方法通過對這幾個變量來對顯示進(jìn)行布局稚疹,其中mMaximum規(guī)定了可見行數(shù),mMinimum決定了控件高度穗熬,也就是控件會占用的布局行數(shù)镀迂。所以把握好這幾個變量的賦值順序,也就清楚了混合使用中出現(xiàn)的各種情況的原因唤蔗。從例子來逐步解釋:
TextView中設(shè)置文本為“ABC\r\nBCD探遵,即文本內(nèi)ABC后換行BCD(模擬單行顯示不下,需要兩行顯示)妓柜。
Test 1:
操作步驟:
1. 先調(diào)用setLines方法設(shè)置TextView控件文本行數(shù)(這里任取2)箱季;
2. 再調(diào)用setMaxLines設(shè)置TextView控件文本最大行數(shù)(這里任取1);
3. 運(yùn)行看圖形效果领虹;
4. 將1與2實驗順序顛倒规哪,然后運(yùn)行看圖形效果求豫;
預(yù)期結(jié)果:
關(guān)于3和4:均以1行顯示且內(nèi)容:“ABC”
實際結(jié)果:
關(guān)于3:以2行顯示塌衰,顯示內(nèi)容為:第一行為:"ABC";第二行為空诉稍;
關(guān)于4:以2行顯示,顯示內(nèi)容為:第一行為:"ABC";第二行為"BCD"
Test 1解析最疆,按步驟通過變量分析:
1. setLines(2)方法調(diào)用后, mMaximum=mMinimum=2;
2. setMaxLines(1)方法調(diào)用后, mMaximum=1,mMinimum=2;
所以3的顯示結(jié)果為可見行數(shù)mMaximum為1(不可見的行為空白)杯巨,布局mMinimum占用行數(shù)為2。
1. setMaxLines(1)方法調(diào)用后, mMaximum=1;
2. setLines(2)方法調(diào)用后, mMaximum=mMinimum=2;
所以4的顯示結(jié)果為可見行數(shù)mMaximum為2(不可見的行為空白)努酸,布局mMinimum占用行數(shù)為2服爷。
Test 2:
操作步驟:
1. 先調(diào)用setLines方法設(shè)置TextView控件文本行數(shù)(這里任取1);
2. 再調(diào)用setMinLines設(shè)置TextView控件文本最大行數(shù)(這里任取2)获诈;
3. 運(yùn)行看圖形效果仍源;
4. 將1與2實驗順序顛倒,然后運(yùn)行看圖形效果舔涎;
預(yù)期結(jié)果:
關(guān)于3和4:均以2行顯示笼踩,且第一行內(nèi)容為:“ABC”;第二行內(nèi)容為“BCD”亡嫌;
實際結(jié)果:
關(guān)于3:以2行顯示嚎于,顯示內(nèi)容為:第一行為:"ABC";第二行為空;
關(guān)于4:以1行顯示挟冠,顯示內(nèi)容為:"ABC";
Test 2解析于购,按步驟通過變量分析:
1. setLines(1)方法調(diào)用后, mMaximum=mMinimum=1;
2. setMinLines(2)方法調(diào)用后, mMaximum=1,mMinimum=2;
所以3的顯示結(jié)果為可見行數(shù)mMaximum為1(不可見的行為空白),布局mMinimum占用行數(shù)為2知染。
1. setMinLines(2)方法調(diào)用后, mMinimum=2;
2. setLines(1)方法調(diào)用后, mMaximum=mMinimum=1;
所以4的顯示結(jié)果為可見行數(shù)mMaximum為1(不可見的行為空白)肋僧,布局mMinimum占用行數(shù)為1。
關(guān)于setSingleLine其實質(zhì)也是根據(jù)參數(shù)持舆,走不同的分支調(diào)用不同的方法來修改mMaximum和mMinimum的值色瘩。具體可參見applySingleLine方法