8

TextViewがテキストの折り返しを選択する場所を制御する方法はありますか?私が抱えている問題は、ピリオドで折り返したいということです。つまり、「米国とカナダで利用可能」のような文字列は、UとSの間のピリオドの後に折り返される可能性があります。ピリオドとスペースがない限り、またはラッピングを制御するためのプログラム的な方法がない限り、ラッピングしますか?

4

2 に答える 2

14

空白でのみテキストを分割する独自のアルゴリズムを作成することになりました。私はもともとPaintのbreakTextメソッドを使用していましたが、いくつかの問題がありました(このバージョンのコードでは実際に解決される可能性がありますが、問題ありません)。これは私の最高のコードではなく、間違いなく少しクリーンアップすることもできますが、機能します。TextViewをオーバーライドしているので、 onSizeChangedメソッドからこれを呼び出して、有効な幅があることを確認します。

private static void breakManually(TextView tv, Editable editable)
{
    int width = tv.getWidth() - tv.getPaddingLeft() - tv.getPaddingRight();
    if(width == 0)
    {
        // Can't break with a width of 0.
        return false;
    }

    Paint p = tv.getPaint();
    float[] widths = new float[editable.length()];
    p.getTextWidths(editable.toString(), widths);
    float curWidth = 0.0f;
    int lastWSPos = -1;
    int strPos = 0;
    final char newLine = '\n';
    final String newLineStr = "\n";
    boolean reset = false;
    int insertCount = 0;

    //Traverse the string from the start position, adding each character's
    //width to the total until:
    //* A whitespace character is found.  In this case, mark the whitespace
    //position.  If the width goes over the max, this is where the newline
    //will be inserted.
    //* A newline character is found.  This resets the curWidth counter.
    //* curWidth > width.  Replace the whitespace with a newline and reset 
    //the counter.

    while(strPos < editable.length())
    {
        curWidth += widths[strPos];

        char curChar = editable.charAt(strPos);

        if(((int) curChar) == ((int) newLine))
        {
            reset = true;
        }
        else if(Character.isWhitespace(curChar))
        {
            lastWSPos = strPos;
        }
        else if(curWidth > width && lastWSPos >= 0)
        {
            editable.replace(lastWSPos, lastWSPos + 1, newLineStr);
            insertCount++;
            strPos = lastWSPos;
            lastWSPos = -1;
            reset = true;
        }

        if(reset)
        {
            curWidth = 0.0f;
            reset = false;
        }

        strPos++;
    }

    if(insertCount != 0)
    {
         tv.setText(editable);
    }
}
于 2013-01-20T08:43:19.903 に答える
-1

WrapTogetherSpanと呼ばれるスパナブルがあります。ドキュメントはありませんが、内部のテキストを折り返してはいけないようです。

于 2013-01-17T06:20:07.697 に答える