Android中调用EditText的setText后getLineCount返回0是什么原因
问题产生原因
- View布局流程未执行完成:
setText()方法仅会更新EditText内部存储的文本内容,而getLineCount()返回的行数依赖文本的布局计算结果,该计算需要在View的onMeasure、onLayout流程执行完成后才会生成。如果在setText()后同步调用getLineCount(),此时View还未完成测量布局,内部Layout对象未初始化,就会返回0。最常见的场景就是在onCreate、onResume等生命周期方法中执行上述操作,此时界面还未完成渲染。 - EditText未attach到窗口:如果是动态创建的EditText,还未添加到父布局中,不会触发View的测量布局流程,无论设置多少次文本,调用
getLineCount()都会返回0。 - 控件处于不可测量状态:如果调用
setText()后立刻将控件设置为GONE,或者控件宽度被设为0,也会导致布局计算无法正常执行,行数返回0。
对应解决方案
- 监听布局完成后再获取行数
通过ViewTreeObserver的OnGlobalLayoutListener监听布局完成事件,此时获取的行数是准确的,使用后需要及时移除监听器避免内存泄漏,示例代码如下:
editText.setText("目标文本内容"); editText.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { int lineCount = editText.getLineCount(); // 此处执行行数相关的业务逻辑 // 用完移除监听器 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { editText.getViewTreeObserver().removeOnGlobalLayoutListener(this); } else { editText.getViewTreeObserver().removeGlobalOnLayoutListener(this); } } });
- 主动计算行数不需要等待View渲染
如果需要提前获取文本对应的行数,不需要等控件渲染完成,可以通过StaticLayout主动计算,示例代码如下:
TextPaint paint = editText.getPaint(); // 注意需要提前获取到EditText的可用宽度,计算结果才准确 StaticLayout layout = new StaticLayout( "目标文本内容", paint, editText.getAvailableWidth(), Layout.Alignment.ALIGN_NORMAL, editText.getLineSpacingMultiplier(), editText.getLineSpacingExtra(), false ); int lineCount = layout.getLineCount();
- 动态创建的EditText先添加到父布局,或者手动触发测量流程后再获取行数。
内容的提问来源于stack exchange,提问作者Spartak Vardanyan
相关产品推荐
相关产品推荐

