2016-05-30 60 views
1

我使用前缀this example帮助创建了编辑文本。通过扩展EditText使用自定义类将android后缀设置为EditText

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

基本上我需要完成这些功能。

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

这是我的代码。

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铝Asimi的答案,我认为这是很好的点开始。它正在工作,但有以下问题。

  • 后缀不与原文一致
  • 没有得到原来的文本颜色

enter image description here

回答

1

我真的很喜欢高质量的结果,似乎这个平台它并不真正的问题上对于一些程序员来说。

对我来说,真的很重要,我的自定义EditText视图带有后缀的外观尽可能自然,所以我用非常优雅和简单的方式解决了它。

而不是做一些不可靠的布局黑客或试图拦截编辑文本的onDraw()方法,在视图的右侧添加一个复合绘图并在其上绘制文本看起来更自然。

这是一个简单的解决方案,它不会破坏任何东西,它看起来非常“原生”。

从你链接的例子来看,确实有很多帮助,它是onMesure()方法的实现,它为复合drawable提供了空间,这正是我如何使用复合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可能会覆盖之前设置的绘图。显然,这个观点不能有一个额外的权利可绘制,因为它是在这个代码中实现的。

+0

对不起,不知何故,我没有注意到这个问题被回答。它正在工作,但不在文本中心。我将在原始问题中添加更多详细信息。 –

+0

@ChathurangaShanJayarathna如果你了解我的代码,就可以实现中心化。仔细阅读。我记得我不想让文字居中。 –