4

デフォルトでは、Android EditTextは、次のように行がビューより長い場合、行を分割します。

Thisisalineanditisveryverylongs (end of view)
othisisanotherline

または、行に句読文字が含まれている場合は、次のようになります。

Thisisalineanditsnotsolong;     (several characters from the end of view)
butthisisanotherline

私の仕事の要件として、次のように、行がビューよりも長い場合にのみ、テキストは行を分割する必要があります。

Thisisalineanditsnotsolong;andt (end of view)
hisisanotherline

これを達成する方法があるに違いありません、私は正しいですか?これまでのところ、これを行う方法は見つかりませんでした。

4

3 に答える 3

4

TextView(およびEditText)がテキストを分割する方法は、内部でBoringLayoutへのプライベート関数呼び出しを介して行われます。したがって、最善の方法は、EditTextをサブクラス化し、これらの関数を書き直すことです。しかし、それは簡単な作業ではありません。

したがって、TextViewクラスには、テキストスタイル用のさまざまなクラスが作成されています。私たちが見ているのはDynamicLayoutです。このクラスでは、StaticLayoutクラス(reflowedと呼ばれる変数内)の参照に到達します。このクラスのコンストラクターには、テキストラップアルゴリズムがあります。

/*
* From the Unicode Line Breaking Algorithm:
* (at least approximately)
*  
* .,:; are class IS: breakpoints
*      except when adjacent to digits
* /    is class SY: a breakpoint
*      except when followed by a digit.
* -    is class HY: a breakpoint
*      except when followed by a digit.
*
* Ideographs are class ID: breakpoints when adjacent,
* except for NS (non-starters), which can be broken
* after but not before.
*/

if (c == ' ' || c == '\t' ||
((c == '.'  || c == ',' || c == ':' || c == ';') &&
(j - 1 < here || !Character.isDigit(chs[j - 1 - start])) &&
(j + 1 >= next || !Character.isDigit(chs[j + 1 - start]))) ||
((c == '/' || c == '-') &&
(j + 1 >= next || !Character.isDigit(chs[j + 1 - start]))) ||
(c >= FIRST_CJK && isIdeographic(c, true) &&
j + 1 < next && isIdeographic(chs[j + 1 - start], false))) {
okwidth = w;
ok = j + 1;

ここですべてのラッピングが行われます。したがって、StaticLayout、DynamicLayout、TextView、そして最後にEditTextをサブクラス化する必要があります。これは、悪夢になると確信しています:(すべてのフローがどのように進行するかさえわかりません。必要に応じて、最初にTextViewを確認してください。 getLinesCount呼び出しを確認します-これが開始点になります。

于 2011-05-26T07:48:16.607 に答える
3

Androidのこの改行アルゴリズムは本当にひどいです、それは論理的にさえ正しくありません-コンマは行の最後の文字であってはなりません。不要な改行のみが生成されるため、テキストのレイアウトが非常に奇妙になります。

于 2011-09-27T14:59:47.300 に答える
1

こんにちはこれは私が最初に別の人から得て、それから少し変更を加える1つの方法です、それはあなたが試してみることができる私にとって本当にうまくいきます。

//half ASCII transfer to full ASCII
public static String ToSBC(String input) { 
    char[] c = input.toCharArray(); 
    for (int i = 0; i< c.length; i++) { 
    if (c[i] == 32) { 
    c[i] = (char) 12288; 
    continue; 
    } 
    if (c[i]<=47 && c[i]>32 ) 
    c[i] = (char) (c[i] + 65248); 
    } 
    return new String(c); 
    }
}

ここにあります。「、」、「。」などの特殊文字をハーフコーナーからフルコーナーに変更すると、かなり効果があります。試してみることができます。

于 2013-01-30T16:39:47.300 に答える