当EditText中的用户输入文本需要自动添加到每个行前缀“*”。
示例:
*先行一些文字
*带有一些文字的第二行
我该怎么做?
答案 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());
}
}