这可能是一个容易回答的问题,但搜索只是出现了膨胀和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 是,请参阅下文。
答案 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();
}
缺点是光标更新前会有一段时间滞后。