每行的EditText前缀

时间:2016-03-21 19:11:37

标签: android android-edittext

当EditText中的用户输入文本需要自动添加到每个行前缀“*”。

示例:

*先行一些文字

*带有一些文字的第二行

我该怎么做?

2 个答案:

答案 0 :(得分:1)

由于您不希望星号成为可编辑文本的一部分,我们可以在每行的开头绘制它。为此,我们继承EditText并覆盖onDraw()方法,迭代线条,并计算每条线的边界以确定绘制角色的位置。绘制星号后,我们调用super.onDraw()方法以允许EditText完成绘制文本,光标,选择等。

public class StarredEditText extends EditText {
    private static final String ASTERISK = "*";

    private float padding;
    private Paint paint;

    public StarredEditText(Context context) {
        this(context, null);
    }

    public StarredEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
        paint = getPaint();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        int baseline;
        final int count = getLineCount();

        for(int i = 0; i < count; i++) {
            baseline = getLineBounds(i, null);
            canvas.drawText(ASTERISK, padding, baseline, paint);
        }

        super.onDraw(canvas);
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        Rect rect = new Rect();
        getLineBounds(0, rect);
        padding = (rect.left - paint.measureText(ASTERISK)) / 2;
    }
}

答案 1 :(得分:0)

如果您希望在用户输入时发生这种情况,请使用onTextChanged()afterTextChanged()回调TextWatcher

或者,如果您在更改了文本并转到下一个EditText后想要它,您可以自己获取值并在星号前加上前缀。

在您的afterTextChanged()中,您可以采取以下措施:

@Override
    public void afterTextChanged(Editable s) {
        if(!s.toString().startsWith("*")){
           yourEditText.setText("*" + yourEditText.getText().toString());
        }

    }