我为我的一个 Activity 创建了一个布局,用户可以在其中的某个 EditText 小部件中插入一个值。我需要其中一些 EditText 必须具有不可编辑的后缀(如 cm、mm 等)。
用户插入值后,我将解析这些 EditText 的内容,避免使用后缀,因此我将处理唯一没有后缀的输入。如何做到这一点?
我已经在 SO 上进行了搜索,但没有任何帮助。
我找到了这样的答案 https://stackoverflow.com/a/20794581/2516399这对我没有帮助。
我希望我的问题很清楚......对不起我的英语
这是我的解决方案:一个在文本后面绘制后缀的 EditText 类。有两个自定义属性用于定义后缀的文本和后缀填充(到 EditText 的左上角)。
public class EditTextWithSuffix extends EditText {
TextPaint textPaint = new TextPaint();
private String suffix = "";
private float suffixPadding;
public EditTextWithSuffix(Context context) {
super(context);
}
public EditTextWithSuffix(Context context, AttributeSet attrs) {
super(context, attrs);
getAttributes(context, attrs, 0);
}
public EditTextWithSuffix(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
getAttributes(context, attrs, defStyleAttr);
}
@Override
public void onDraw(Canvas c){
super.onDraw(c);
int suffixXPosition = (int) textPaint.measureText(getText().toString()) + getPaddingLeft();
c.drawText(suffix, Math.max(suffixXPosition, suffixPadding), getBaseline(), textPaint);
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
textPaint.setColor(getCurrentTextColor());
textPaint.setTextSize(getTextSize());
textPaint.setTextAlign(Paint.Align.LEFT);
}
private void getAttributes(Context context, AttributeSet attrs, int defStyleAttr) {
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.EditTextWithSuffix, defStyleAttr, 0);
if(a != null) {
suffix = a.getString(R.styleable.EditTextWithSuffix_suffix);
if(suffix == null) {
suffix = "";
}
suffixPadding = a.getDimension(R.styleable.EditTextWithSuffix_suffixPadding, 0);
}
a.recycle();
}
}
这是属性定义:
<resources>
<declare-styleable name="EditTextWithSuffix">
<attr name="suffix" format="string|reference" />
<attr name="suffixPadding" format="dimension" />
</declare-styleable>
</resources>