最近公司android客户端有个需求,根据文本行数的不同,设置不同的显示位置,解决这个需求,首先得获得TextView的真实行数,于是调用getLineCount()方法,结果这个值获得的始终为0 ,关于如何获得真实的行数值,有以下解决方案:
1,绘画完成之前调用的,在这里面可以获取到行数,当然也可以获取到宽高等信息。
ViewTreeObserver vto = mContent.getViewTreeObserver();
vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
if(mContent.getLineCount() == 1){
} else {
}
return false;
}
});
2,绘画完成之后调用的,在这里面可以获取到行数,当然也可以获取到宽高等信息。
mContent.setText(barModel.getContentTitle());
mContent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
mContent.getViewTreeObserver().removeGlobalOnLayoutListener(this);
if(mContent.getLineCount() == 1){
Log.e("TAG","---------"+mContent.getLineCount());
} else {
}
}
});
mContent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
mContent.getViewTreeObserver().removeGlobalOnLayoutListener(this);
if(mContent.getLineCount() == 1){
Log.e("TAG","---------"+mContent.getLineCount());
} else {
}
}
});
3,
使用post,绘制完成在调用getLineCount()
mContent.post(new Runnable() { @Override public void run() { if(mContent.getLineCount() == 1){ mContent.setPadding(0,(int)mContext.getResources().getDimension(R.dimen.space_12),0,0); mReadNum.setPadding(0,0,0,(int)mContext.getResources().getDimension(R.dimen.space_12)); mCollectionNum.setPadding(0,0,0,(int)mContext.getResources().getDimension(R.dimen.space_12)); } else { mContent.setPadding(0,0,0,0); mReadNum.setPadding(0,0,0,0); mCollectionNum.setPadding(0,0,0,0); } } });
经过测试三种方案均可行,但是如果是listview中TextView,根据LineCount切换位置,会出现TextView复用,导致TextView位置在滑动速度快的情况下位置瞬间混乱,采用第三种方案没有此问题,至于采用前两种方案出现问题的原因不得而知,有遇到这种情况的可以一起探讨一下原因。