【问题标题】:Custom EditText default cursor position自定义 EditText 默认光标位置
【发布时间】:2018-06-22 12:14:14
【问题描述】:

我有一个自定义的 EditText。它有一个不可编辑的前缀和后缀,以及一个可编辑的中间部分。问题是默认光标位置始终位于可编辑文本的开头,如下面的屏幕截图所示。

这是我的自定义视图的onDraw()

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    suffixXPosition = (int) (textPaint.measureText(getText().toString()) + leftPadding + textPaint.measureText(prefix));
    canvas.drawText(prefix, prefixXPosition, getBaseline(), textPaint);
    canvas.drawText(getText().toString(), stringXPosition, getBaseline(), textPaint);
    canvas.drawText(suffix, suffixXPosition, getBaseline(), textPaint);
}

这是非常基本的。它只是在画布上绘制文本。

我希望在渲染 EditText 时光标出现在可编辑文本的末尾 我怎样才能做到这一点? 我希望视图自己处理这种情况。

我在 onDraw 方法中尝试了setSelection(getText().toString().length());。它将光标绘制在正确的位置。但这使我无法在触摸事件上更改光标位置。

【问题讨论】:

  • 不要在onDraw中设置光标位置。设置焦点监听器,并在获得焦点时设置它。
  • @GabeSechan 它允许我改变光标位置,这与 onDraw 方法不同。但是当第一次渲染视图时,光标仍然在错误的位置。
  • 然后在创建时也调用它
  • @GabeSechan 创建时间?你的意思是什么时候调用构造函数?我相信之后会调用 onDraw 并将光标绘制在错误的位置。
  • 为什么会把它画在错误的位置?它会在你设置的地方绘制它。它根本不应该在绘制时设置位置

标签: android android-edittext android-custom-view


【解决方案1】:

尝试将光标位置设置在onAttachedToWindow()

当视图附加到窗口时调用。此时它有一个 Surface 并将开始绘制。请注意,保证在 onDraw(android.graphics.Canvas) 之前调用此函数,但是它可以在第一个 onDraw 之前的任何时间调用——包括在 onMeasure(int, int) 之前或之后。

@Override
    public void onAttachedToWindow() { 
        super.onAttachedToWindow(); 
        setSelection(getText().toString().length());//set your cursor position
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-21
    • 1970-01-01
    相关资源
    最近更新 更多