Android 编辑每行的文本前缀
当用户在EditText中输入文本时,需要自动向每行添加前缀“*” 示例: *第一行是一些文本 *第二行有一些文字Android 编辑每行的文本前缀,android,android-edittext,Android,Android Edittext,当用户在EditText中输入文本时,需要自动向每行添加前缀“*” 示例: *第一行是一些文本 *第二行有一些文字 我该怎么做?如果希望在用户键入时发生这种情况,请与onTextChanged()或posterextchanged()回调一起使用 或者,如果您在他们更改文本并转到下一个EditText后需要它,您可以自己获取值并在星号前面加上前缀 在您的PostTextChanged()中,您可以执行以下操作: @Override public void afterTextChanged
我该怎么做?如果希望在用户键入时发生这种情况,请与
onTextChanged()
或posterextchanged()
回调一起使用
或者,如果您在他们更改文本并转到下一个EditText
后需要它,您可以自己获取值并在星号前面加上前缀
在您的PostTextChanged()
中,您可以执行以下操作:
@Override
public void afterTextChanged(Editable s) {
if(!s.toString().startsWith("*")){
yourEditText.setText("*" + yourEditText.getText().toString());
}
}
由于您不希望星号成为可编辑文本的一部分,我们可以在每行的开头绘制星号。为此,我们对
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;
}
}
public类StarredEditText扩展EditText{
私有静态最终字符串星号=“*”;
私人浮动填充;
私人油漆;
公共星号编辑文本(上下文){
这个(上下文,空);
}
公共星号编辑文本(上下文、属性集属性){
超级(上下文,attrs);
paint=getPaint();
}
@凌驾
受保护的void onDraw(画布){
int基线;
最终整数计数=getLineCount();
for(int i=0;i
是否希望它成为实际文本的一部分;i、 例如,可复制、可删除等。?还是希望它更像IDE中的行号?@MikeM。谢谢你的回复。当用户在字段中输入/删除一些文本到符号开头添加的每一行时,我希望这样做。对,但假设我选择并复制了示例中的第一行。它应该复制“*第一行一些文本”,还是只复制“第一行一些文本”,而不带星号?也就是说,“*”是可编辑文本的一部分吗?如果是,可以删除吗?@MikeM。如果复制文本,它将是不带符号*的复制。我希望在用户键入时发生这种情况。我尝试使用TextWatcher。我尝试计数所有行,将每行作为字符串,添加前缀,然后使用StringBuilder在一个字符串中添加所有行,然后清除文本并再次设置文本。