You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:39:40