如何从自定义TextView中获取对布局的引用

时间:2014-12-30 10:44:42

标签: java android layout textview

这可能是一个容易回答的问题,但搜索只是出现了膨胀和xml布局等问题,这不是我想要的。

我有一个自定义TextView,我想在上面绘制光标。 (我不能使用EditText。)为了绘制线,我需要从光标所在的字符偏移量计算各种坐标。我尝试了以下作为自定义TextView的方法:

public void setCursorLocation(int characterOffset) {

    Layout layout = this.getLayout();

    int line = layout.getLineForOffset(characterOffset);
    mCursorX = layout.getPrimaryHorizontal(characterOffset);
    mCursorBaseY = layout.getLineBaseline(line);
    mCursorBottomY = layout.getLineBottom(line);
    mCursorAscentY = layout.getLineAscent(line);
}

但是,布局为null。我甚至尝试将TextView作为参数传递,但布局仍为null。我做错了什么?

public void setCursorLocation(View view, int characterOffset) {

    Layout layout = ((TextView) view).getLayout();

    ...
}

更新

我将其更改为以下

public void setCursorLocation(Layout layout, int characterOffset) {

但即使是那个布局也是空的。然后我在主要活动中查看了我在哪里调用它:

inputWindow.setText(displayText);
inputWindow.setCursorLocation(inputWindow.getLayout(), glyphCurosrPosition);

在调用inputWindow.getLayout()之前观察表达式setText很好,然后突然变为空。我猜这是因为它使自己失效。我是如何/何时绘制光标的?我的猜测是发布一个可运行的。 更新2 是,请参阅下文。

1 个答案:

答案 0 :(得分:0)

这个解决方案最终对我有用。

来自主要活动:

inputWindow.setText(displayText);
inputWindow.post(new Runnable() {

    @Override
    public void run() {

        inputWindow.setCursorLocation(glyphCursorPosition);
    }

});

在自定义TextView中:

public void setCursorLocation(int characterOffset) {

    Layout layout = this.getLayout();

    int line = layout.getLineForOffset(characterOffset);
    mCursorX = layout.getPrimaryHorizontal(characterOffset);
    mCursorBaseY = layout.getLineBaseline(line);
    mCursorBottomY = layout.getLineBottom(line);
    mCursorAscentY = layout.getLineAscent(line);

    this.invalidate();
}

缺点是光标更新前会有一段时间滞后。