我有一个很大的EditText
用于输入代码。它可以水平滚动(故意嵌套在HorizontalScrollView
中),也可以与ScrollView
内的页面其余部分一起垂直滚动。我还有错误突出显示功能:当用户按下预览或保存时,代码将被验证并使用BackgroundColorSpans
突出显示错误:
Editable text = mConfig.getText();
for (OverlayValidator.ValidationError error : errors) {
text.setSpan(
new BackgroundColorSpan(error.isCritical ? 0x40FF0000 : 0x40FF8800),
error.errorStart, error.errorEnd,
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE | Spanned.SPAN_INTERMEDIATE
);
}
现在我想专注于一个任意错误,即如果它当前不在屏幕上则将其滚动到屏幕上。 StackOverflow上广泛建议的解决方案是强制选择所需的范围:
Selection.setSelection(mConfig.getText(), errors.get(0).errorStart, errors.get(0).errorEnd);
这确实有效,并且范围会自动滚动到视图中(video here),然而,正如在锡上所说,它会突出显示范围,这是不可取的。
我可以通过只指定一个放置光标的位置来避免选择,就像这样
Selection.setSelection(mConfig.getText(), errors.get(0).errorEnd);
但这只会确保光标进入屏幕,其余范围可能会保持在屏幕外(another video)。
尝试调用两个结果只导致最后一个选择命令生效,即使我这样称呼它们:
Selection.setSelection(mConfig.getText(), errors.get(0).errorStart, errors.get(0).errorEnd);
Handler handler = new Handler();
handler.post(new Runnable() {
@Override
public void run() {
Selection.setSelection(mConfig.getText(), errors.get(0).errorEnd);
}
});
基本上我需要Selection
的副作用(滚动到视图中)而无需实际选择。
我尝试检查代码以了解所选范围如何在屏幕上传唤,但代码太纠结了(跨度,观察者和所有这些东西),我无法弄明白。从文档我遇到方法View.requestRectangleOnScreen(Rect)
,但如何获取矩形滚动到? (我总是可以拿TextPaint
并自己测量角色,但必须有更好的方法!)
感谢。
答案 0 :(得分:0)
实际上我当时已经解决了,但忘记发布答案了。
您可以通过调用TextView的$withdrawal_amount = 100;
$user_balance = "SELECT user_balance FROM balances FOR UPDATE"; //actually return 100?(not sure about it, that is what my question about)
if($user_balance > $withdrawal_amount){
//allow withdrawal
$update_sql_query = "UPDATE balances SET user_balance = user_balance - " . $withdrawal_amount;
}
对象上的 $product_subtotal = 100;
$user_balance = "SELECT user_balance FROM balances FOR UPDATE"; //actually return 100?(not sure about it, that is what my question about)
if($user_balance > $product_subtotal){
//allow withdrawal
$update_sql_query = "UPDATE balances SET user_balance = user_balance - " . $product_subtotal;
}
来获取所需子字符串的坐标,然后将这些坐标请求聚焦。例如,我将getSelectionPath(start, end, outPath)
子类化并添加了此方法:
Layout