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

咨询:如何实现带方框编号的自定义EditText设计

实现图中分段横线样式的EditText方案

要做出图里这种类似笔记本横线的EditText,有几个实用的实现方式:

方案一:自定义背景Drawable(最简单)

直接给EditText设置带重复横线的背景,不用写Java/Kotlin代码:

  1. 在res/drawable文件夹下新建edittext_notebook_bg.xml:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 输入框的底边框 -->
    <item>
        <shape android:shape="rectangle">
            <solid android:color="#ffffff" />
            <stroke android:width="1dp" android:color="#cccccc" />
        </shape>
    </item>
    <!-- 重复的横向分隔线 -->
    <item>
        <bitmap
            android:src="@drawable/horizontal_line"
            android:tileMode="repeat"
            android:gravity="top" />
    </item>
</layer-list>
  1. 再建horizontal_line.xml(用来做重复的单条横线):
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="line">
    <stroke
        android:width="1dp"
        android:color="#cccccc" />
    <!-- 这里的height对应每行的高度,要和EditText的行高匹配 -->
    <size android:height="48dp" />
</shape>
  1. 布局里用这个EditText:
<EditText
    android:id="@+id/notebook_et"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/edittext_notebook_bg"
    android:padding="16dp"
    android:lineSpacingExtra="8dp"
    android:gravity="top" />

方案二:自定义EditText(最灵活)

如果需要随输入行数自动调整横线数量、改线的颜色/粗细,就自己写个EditText子类重写绘制逻辑:

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.widget.EditText;

public class NotebookEditText extends EditText {
    private Paint linePaint;

    public NotebookEditText(Context context) {
        super(context);
        initPaint();
    }

    public NotebookEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
        initPaint();
    }

    public NotebookEditText(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initPaint();
    }

    private void initPaint() {
        // 初始化横线画笔
        linePaint = new Paint();
        linePaint.setColor(getResources().getColor(R.color.gray_light)); // 替换成你要的颜色
        linePaint.setStrokeWidth(1f);
        // 关掉默认背景,避免和自定义横线冲突
        setBackground(null);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        int lineHeight = getLineHeight();
        int totalLines = getLineCount();
        int visibleLines = getHeight() / lineHeight;

        // 绘制所有可见的横线,包括输入框内的空白行
        for (int i = 0; i < visibleLines || i < totalLines; i++) {
            float y = (i + 1) * lineHeight + getPaddingTop();
            canvas.drawLine(getPaddingLeft(), y, getWidth() - getPaddingRight(), y, linePaint);
        }
        // 先画横线再画文字,防止文字被盖住
        super.onDraw(canvas);
    }
}

布局里直接用这个自定义View:

<com.yourpackagename.NotebookEditText
    android:layout_width="match_parent"
    android:layout_height="240dp"
    android:padding="16dp"
    android:lineSpacingExtra="4dp"
    android:gravity="top" />

方案三:快速凑活版

如果只是临时要个类似效果,也可以用android:drawableTop加重复Drawable,但灵活性差,适合快速测试:

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:drawableTop="@drawable/horizontal_line"
    android:drawablePadding="0dp"
    android:background="@drawable/edittext_border" />

内容的提问来源于stack exchange,提问作者groff07

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 05:50:20