我在this example的帮助下创建了带前缀的编辑文字。
同样的方法我尝试实现后缀来编辑文本。我已成功将后缀添加到光标的右侧。但它不会显示在编辑文本的最末端。当我键入它时,键入的文本覆盖在后缀上。我知道还有其他方法可以实现这一目标,但我正试图解决这个问题。请帮忙。
基本上我需要实现这些功能。
这是我的代码。
/nowin
修改1:
我尝试了Iharob Al Asimi的答案,我认为这一点很有意义。它有效,但有以下问题。
答案 0 :(得分:1)
我非常喜欢高质量的结果,似乎在这个平台上它对某些程序员来说并不重要。
对我来说非常重要,我的自定义EditText
视图带有后缀的外观尽可能自然,所以我以非常优雅和简单的方式解决了它。
除了做一些不可靠的布局黑客或试图拦截编辑文本的onDraw()
方法之外,在视图右侧添加复合可绘制并在其上绘制文本似乎更自然。< / p>
这是一个简单的解决方案,它不会破坏任何东西,它看起来非常&#34; 原生&#34;。
从您链接的示例中,有一些确实有很大帮助,它是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
可能会覆盖以前设置的drawables。很明显,这个视图在此代码中实现时不会有额外的权利。