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

标签 android android-edittext

我在 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 的回答,我认为这是一个很好的开始。它正在运行,但存在以下问题。

  • 后缀与原文不符
  • 没有得到原始文本颜色

enter image description here

最佳答案

我真的很喜欢高质量的结果,在这个平台上似乎对一些程序员来说并不重要。

对我来说这真的很重要,我的带有后缀的自定义 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/

相关文章:

android - 如何将字符串变量附加到电子邮件

java - Android Studio 中的动态 ListView : Selecting random element and update list view

android - 无限循环错误EditText

android - 使用 EditText 过滤 RecyclerView

android - 预加载插页式广告

android - 如何在 ListView 中为 TextView 的背景颜色添加渐变效果?

android - React-Native 0.63 无法访问 Android 10 中的设备存储图像

ListView 中的 Android EditText - 键盘

android - 为什么不是我的 editText.requestFocus();在职的?

android - ListView 中的 EditText 在滚动时丢失内容