以编程方式将一系列EditText滚动到视图中

时间:2016-06-13 21:07:13

标签: android android-edittext textview

我有一个很大的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并自己测量角色,但必须有更好的方法!)

感谢。

1 个答案:

答案 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