EditText自适应高度
在开发中做到一个表单页面,由很多EditText构成的,为了使页面尽量美观整齐,每个EditText都设置为固定高度,可是当过多的文字内容加载进来时,就会导致部分文字由于控件高度的原因显示不出来,如下图 标题行展示
由于数据时从数据库中加载,所以文字长度是不固定的,所以我们就可以根据文字长度来自动计算控件的高度,代码如下,其他控件也可依次类推
/**
* 根据文字内容计算重绘EditText的高度
*
* @param linearLayout
* 父控件
* @param editText
* 文本控件
* @param contents
* 文字内容
*/
private void caculateHeight ( final LinearLayout linearLayout ,
final EditText editText , final String contents) {
// 监听控件绘制
ViewTreeObserver vto = editText .getViewTreeObserver();
vto.addOnPreDrawListener( new ViewTreeObserver .OnPreDrawListener() {
@Override
public boolean onPreDraw() {
Boolean hasMessured = (Boolean ) editText .getTag();
if ( hasMessured == false ) {
editText.setTag( true );
int width = editText.getWidth(); // 控件宽度
int height = editText.getHeight(); // 控件高度
if ( width != 0 && height != 0) {
if (!TextUtils .isEmpty (contents )) {
// 显示文字个数字数
int len = contents .length();
// 得到字体像素
float px = editText .getTextSize();
Log. i( "time" , "字体像素:" + px + ",控件宽度:" + width );
double length = Math .floor (width / px ); // 能容纳字母个数
if ( len > length) {
int llWidth = linearLayout .getLayoutParams().width ;
int offset = ( int) (len / length ); // 计算出需要行数
linearLayout
.setLayoutParams( new LinearLayout .LayoutParams(
llWidth, ( int) ( height + px
* offset)));
}
}
}
}
return true ;
}
});
}