通过扩展EditText,使用自定义类将android后缀设置为EditText

时间:2016-05-30 16:16:53

标签: android android-edittext

我在this example的帮助下创建了带前缀的编辑文字。

同样的方法我尝试实现后缀来编辑文本。我已成功将后缀添加到光标的右侧。但它不会显示在编辑文本的最末端。当我键入它时,键入的文本覆盖在后缀上。我知道还有其他方法可以实现这一目标,但我正试图解决这个问题。请帮忙。

基本上我需要实现这些功能。

  • 后缀应显示在编辑文本的末尾。
  • 后缀不应与用户输入的文字重叠。

这是我的代码。

/nowin

修改1:

我尝试了Iharob Al Asimi的答案,我认为这一点很有意义。它有效,但有以下问题。

  • 后缀与原始文字不对齐
  • 未获得原始文字颜色

enter image description here

1 个答案:

答案 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。很明显,这个视图在此代码中实现时不会有额外的权利。