私は独自のテキストエディタを作成しており、段落間に常に余分なスペースを入れたいので、EditTextのOnKeyListenerをオーバーライドして、Enterキーを押すとテキストに2つの改行が挿入され、カーソルが段落の先頭で、1文字ではなく2文字が削除されます。
簡単そうに見えますが、私の問題は、Enterキーを押してからBackspaceキーを押したときに入力メソッド(つまりキーボード)が単語の編集を終了した場合、その単語を下線付きの自動で置き換えてBackspace自体を処理しようとすることです。それ自体の修正可能なバージョン(単語をそれ自体で上書きする)。ただし、余分な改行のためにカーソルが2文字前に移動し、入力メソッドはそれを認識しないため、上書きを行うと1文字ずれます。
それが混乱していた場合は申し訳ありません。バグの例を次に示します(カーソルがある場所の垂直バーマーク):
空の行に単語を書く
test|
Enterキーを押すと、新しい行が表示されます
test |
削除を押します
ttest|
バグを修正するためにこれまでに試したこと:
OnKeyListenerを使用してバックスペースを適切に処理します。残念ながら、OnKeyListenerは、Inputメソッドが処理を実行した後にのみキーイベントを取得します。
TextWatcherを使用して、入力メソッドが実行したことを元に戻します。残念ながら、TextWatcherには、Backspaceが押されたかどうか、または表示されているテキストが他の何かの結果であるかどうかを知る方法がありません。
Enterキーが押されるたびに、改行を自動的に追加するという考え全体を破棄します。残念ながら、段落の後に空白を追加する方法は他にないようです。私の知る限り、TextViewのスパンは段落に水平方向の余白を追加することしかできず、垂直方向の余白を追加することはできません。
したがって、入力メソッドがバックスペースを取得する前に、バックスペースをキャッチしようとするのが最善の策だと思います(ちなみに、OnKeyPreImeも機能しませんでした)。自分でIMEを完全に作成する必要はなく、ユーザーが好きなIMEで入力できるようにしたいのですが、カスタムIMEをテキストエディターにバンドルする必要がある場合は、そうしてください。それでも、オートコレクトがどのように機能し、どこに実装されているかについてのドキュメントはほとんどないため、どこから始めればよいのかさえわかりません。
どんな助けでも大歓迎です。前もって感謝します!