8

さて、私はリッチ テキスト エディターを構築しようとしています。編集可能なテキスト (太字、斜体、URL など) をフォーマットするためのボタンがいくつかあります。すべてのテキスト修正オプションを有効にしてGoogle キーボード
を使用しています ( [設定] > [言語と入力] > [ Google キーボード] > [テキスト修正] )。

私は次のことを行います:

私のEditTextでは、テキストを書きます。
文章

SPAN_EXCLUSIVE_EXCLUSIVEそれを選択し、 (33) をフラグとして太字のスパンを適用します。
選択したテキスト
ここに画像の説明を入力

次に、カーソルを末尾に移動します。
最後にカーソル

最後に、テキストの末尾にテキストを追加します。追加するテキストは太字にしないでください。
太字のテキスト

さて、ここで問題です。太字のスパン フラグが変更されました...なぜ!?

ここにいくつかのログがあります:

D/ContentUtils: beforeTextChanged: start  end  span             flags
D/ContentUtils: beforeTextChanged: 0      7    ChangeWatcher    8388626
D/ContentUtils: beforeTextChanged: 0      7    ChangeWatcher    6553618
D/ContentUtils: beforeTextChanged: 0      7    TextKeyListener  18
D/ContentUtils: beforeTextChanged: 0      7    SpanController   18
D/ContentUtils: beforeTextChanged: 7      7    START            546
D/ContentUtils: beforeTextChanged: 7      7    END              34
D/ContentUtils: beforeTextChanged: 0      7    SpellCheckSpan   33
D/ContentUtils: beforeTextChanged: 0      7    CustomBoldSpan   33

D/ContentUtils: onTextChaghed
D/ContentUtils: onTextChaghed:     0      8    ChangeWatcher    8392722
D/ContentUtils: onTextChaghed:     0      8    ChangeWatcher    6557714
D/ContentUtils: onTextChaghed:     0      8    TextKeyListener  4114
D/ContentUtils: onTextChaghed:     0      8    SpanController   4114
D/ContentUtils: onTextChaghed:     8      8    START            546
D/ContentUtils: onTextChaghed:     8      8    END              34
D/ContentUtils: onTextChaghed:     0      8    CustomBoldSpan   4129
D/ContentUtils: onTextChaghed:     0      8    UnderlineSpan    289
D/ContentUtils: onTextChaghed:     0      8    ComposingText    289

D/ContentUtils: afterTextChanged
D/ContentUtils: afterTextChanged:  0      8    ChangeWatcher    8392722
D/ContentUtils: afterTextChanged:  0      8    ChangeWatcher    6557714
D/ContentUtils: afterTextChanged:  0      8    TextKeyListener  4114
D/ContentUtils: afterTextChanged:  0      8    SpanController   4114
D/ContentUtils: afterTextChanged:  8      8    START            546
D/ContentUtils: afterTextChanged:  8      8    END              34
D/ContentUtils: afterTextChanged:  0      8    CustomBoldSpan   4129
D/ContentUtils: afterTextChanged:  0      8    UnderlineSpan    289
D/ContentUtils: afterTextChanged:  0      8    ComposingText    289
D/ContentUtils: afterTextChanged:  0      8    SpellCheckSpan   33

別のキーボードを使用すると、すべてうまくいきました。
テキスト修正設定を無効にすると、すべてうまくいきました。私のスパンはすべてカスタム スパンであり、既存の Android スパンをサブクラス化します。

Google キーボードがスパンを独自に変更しているようです (おそらくShow suggestions設定のため)。
どうすればこれを回避できますか?
たぶん、スパンフラグについて何か不足していますか?

4

1 に答える 1

3

わかりました、いくつかの調査の結果、キーボードは入力中に単語の周りにいくつかのスパンを適用して、提案を管理しているようです.

問題は、入力された文字ごとに、単語が削除され、追加された文字で追加されます。この時点で、単語の途中にあるようなカスタム スパンをいくつか失います。

EditText に TextWatcherを追加すると、2 回呼び出されます。1回目は追加された文字で、2 回目は単語全体を削除して追加し直した後です。まったく便利ではありません。

したがって、醜い解決策は、すべてのスパンをコピーしてbeforeTextChanged()、2 番目のafterTextChanged(). しかし、実装は複雑です。

とにかく、他のアプリのほうがうまくいくわけではありません。GMail と Evernote にも同じような問題があります。私は心配しないことを選択し、醜い解決策を適用しません。私のリッチテキストエディタはこんな感じで使えます...

于 2016-09-26T13:21:07.180 に答える