EditText忽略lineSpacingMultiplier问题的解决办法及代码示例
解决EditText行间距无法调整的系统bug问题
最近踩了个头疼的坑:EditText的行间距怎么设置都不生效,查了发现是个已知的Android系统bug导致的。为了绕过这个限制,我自定义了一个LinedEditText控件,通过监听文本变化(onTextChanged)并重写绘制逻辑来解决,代码如下:
import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.text.Editable; import android.text.TextWatcher; import android.util.AttributeSet; /** * Created by yccheok on 24/3/2018. */ public class LinedEditText extends android.support.v7.widget.AppCompatEditText { // 补全所有必要的构造方法 public LinedEditText(Context context) { super(context); init(); } public LinedEditText(Context context, AttributeSet attrs) { super(context, attrs); init(); } public LinedEditText(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init() { // 先设置需要的行间距参数 setLineSpacing(10f, 1.3f); // 第一个参数是额外行间距,第二个是行高倍数 // 通过监听文本变化,强制重绘确保行间距生效 addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) {} @Override public void onTextChanged(CharSequence s, int start, int before, int count) { // 文本改变时触发重绘,解决bug导致的行间距不更新问题 invalidate(); } @Override public void afterTextChanged(Editable s) {} }); } @Override protected void onDraw(Canvas canvas) { // 可选:绘制行线,让编辑区域更像记事本 Paint linePaint = new Paint(); linePaint.setStrokeWidth(1f); linePaint.setColor(0xFFF0F0F0); // 浅灰色行线 int lineCount = getLineCount(); int lineHeight = getLineHeight(); int leftPadding = getPaddingLeft(); int rightPadding = getPaddingRight(); int contentWidth = getWidth() - leftPadding - rightPadding; for (int i = 0; i < lineCount; i++) { int baseline = getLineBounds(i, null); canvas.drawLine(leftPadding, baseline + 2, leftPadding + contentWidth, baseline + 2, linePaint); } super.onDraw(canvas); } }
说明:原代码片段有部分截断,我补充了完整的构造方法和核心逻辑。这个方案的核心是通过onTextChanged监听文本变化,强制控件重绘,从而绕过系统bug导致的行间距不生效问题;同时还保留了LinedEditText的特色——绘制行线,让编辑体验更好。
内容的提问来源于stack exchange,提问作者Cheok Yan Cheng
相关产品推荐
相关产品推荐

