2016-06-13 16 views
2

コードの入力には大文字のEditTextが使用されています。水平方向に(HorizontalScrollViewに意図的に入れ子になって)スクロールし、ページの残りの部分と一緒に垂直方向にスクロールしてScrollViewにすることができます。すなわち上にそれをスクロールし、今私は、任意のエラーに集中したいEditTextの範囲をプログラム的にスクロールして表示します

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 
    ); 
} 

:ユーザーはプレビューや保存を押すと、コードが検証され、エラーは、このようなBackgroundColorSpansを使用して強調表示されます:私はまた、機能性を強調し、エラーを持っています現在スクリーンから外れている場合は画面に表示されます。 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

実際に私はそれを解決しましたが、答えを投稿するのを忘れました。

TextViewのLayoutオブジェクトでgetSelectionPath(start, end, outPath)を呼び出し、フォーカスを要求することで、目的の部分文字列の座標を取得できます。たとえば、TextViewをサブクラス化し、このメソッドを追加しました。

// ...  
private Path mTempPath = new Path(); 
private RectF mTempRectF = new RectF(); 
private Rect mTempRect = new Rect(); 
// ... 

public void requestFocusRange(int start, int end) { 
    final Layout layout = getLayout(); 
    if (layout == null) { 
     // probably rotating the screen, do nothing 
     return; 
    } 

    layout.getSelectionPath(start, end, mTempPath); 
    mTempPath.computeBounds(mTempRectF, false); 
    mTempRectF.roundOut(mTempRect); 

    // Fix the coordinates origin 
    final int paddingLeft = getTotalPaddingLeft(); 
    mTempRect.offset(paddingLeft, getTotalPaddingTop()); 

    // Unnecessary - I'm just adding extra spacing to the focused rect 
    mTempRect.inset(-paddingLeft, -paddingLeft); 

    requestRectangleOnScreen(mTempRect, false); 
} 
関連する問題