我在 this example 的帮助下创建了带前缀的编辑文本.
与我尝试实现后缀以编辑文本的方式相同。我已经成功地在我的光标右侧添加了后缀。但是它没有显示在编辑文本的最后。当我在上面打字时,打字的文字会覆盖在后缀上。我知道还有其他方法可以实现这一目标,但我正在努力实现这一目标。请帮忙。
基本上我需要完成这些功能。
- 后缀应显示在编辑文本的末尾。
- 后缀不应覆盖用户输入的文本。
这是我的代码。
public class SuffixEditText extends EditText {
private String mSuffix = "Suffix";
private Rect mSuffixRect = new Rect();
public SuffixEditText(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
getPaint().getTextBounds(mSuffix, 0, mSuffix.length(), mSuffixRect);
mSuffixRect.left += getPaint().measureText(" ");
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawText(mSuffix, super.getCompoundPaddingRight(), getBaseline(), getPaint());
}
@Override
public int getCompoundPaddingRight() {
return super.getCompoundPaddingRight()+ mSuffixRect.width();
}
编辑 1:
我尝试了 Iharob Al Asimi 的回答,我认为这是一个很好的开始。它正在运行,但存在以下问题。
- 后缀与原文不符
- 没有得到原始文本颜色
最佳答案
我真的很喜欢高质量的结果,在这个平台上似乎对一些程序员来说并不重要。
对我来说这真的很重要,我的带有后缀的自定义 EditText
View 的外观尽可能自然,所以我以一种非常优雅和简单的方式解决了它。
与其进行一些不可靠的布局 hack 或试图拦截编辑文本的 onDraw()
方法,不如在 View 右侧添加一个复合可绘制对象并绘制上面有文字。
这是一个简单的解决方案,它不会破坏任何东西,而且看起来非常“原生”。
从你链接的例子中,有一些东西真的很有帮助,它是 onMesure()
方法的实现,它为复合 drawable 腾出了空间,这正是我得到的使用复合可绘制对象的想法。
这是代码,如果出现相同的需求,您可以在以后的项目中使用它
public class SuffixEditText extends EditText {
private TextPaint mTextPaint;
private String mSuffix;
private float mSuffixWidth;
private Drawable mSuffixDrawable;
private void initialize(Context context) {
Resources resources = getResources();
mTextPaint = new TextPaint();
mTextPaint.setTextSize(getTextSize());
// Using the same foreground color could
// be confusing.
mTextPaint.setColor(getCurrentHintTextColor());
mTextPaint.setTextAlign(Paint.Align.RIGHT);
mSuffixDrawable = new Drawable() {
@Override
public void draw(@NonNull Canvas canvas) {
if (mSuffix == null)
return;
canvas.drawText(mSuffix, 0, getPaddingTop(), mTextPaint);
}
@Override
public void setAlpha(int alpha) {
}
@Override
public void setColorFilter(ColorFilter colorFilter) {
}
@Override
public int getOpacity() {
return PixelFormat.OPAQUE;
}
};
}
public SuffixEditText(Context context) {
super(context);
initialize(context);
}
public SuffixEditText(Context context, AttributeSet attrs) {
super(context, attrs);
initialize(context);
}
public SuffixEditText(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initialize(context);
}
public void setSuffix(String suffix) {
mSuffix = suffix;
setCompoundDrawables(null, null, mSuffixDrawable, null);
}
@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
if (mSuffix != null)
mSuffixWidth = mTextPaint.measureText(" " + mSuffix);
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
@Override
public int getCompoundPaddingRight() {
return super.getCompoundPaddingRight() + (int) Math.ceil(mSuffixWidth);
}
}
在我看来,android 的 API 设计得很糟糕,它让做一些简单的事情变得非常困难,而在其他时候做其他事情却非常愚蠢。我更喜欢像 Qt 这样的一致的 API,您可以在其中做任何您想做的事情。
注意:这段代码可能恰好有一些优化,但我不是 Java 程序员,所以我忽略了事情的工作方式,无法提出更高效的代码。
此外,更好的实现会处理其他可绘制对象,以防它们存在。因为将它们设置为 null
可能会覆盖之前设置的可绘制对象。显然,此 View 不能有额外的右侧可绘制对象,因为它是在此代码中实现的。
关于android - 通过扩展 EditText 使用自定义类将 android 后缀设置为 EditText,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37530011/