4

Android用のカスタムキーボードを作りました。私が使用するキーボードのバックスペースボタンを押すと

getCurrentInputConnection().deleteSurroundingText(1, 0);

入力フィールドから 1 文字を削除します。しかし、テキストを選択してバックスペースボタンを押しても、選択したテキストは削除されません。バックスペースボタンを押したときに選択したテキストもキーボードから削除されるようにするには、入力接続でどの方法を使用すればよいですか?

4

2 に答える 2

10

削除するときは、次の状況を考慮する必要があります。

  • 作曲の選択があります。
  • 編集者/ユーザーは、テキスト上でカーソルを選択しています。
  • いかなる種類の選択もありません。

選択がある場合は、削除する必要があります。選択がない場合は、カーソルの前の文字を削除する必要があります。

解決策 1

最初はこの方法を使っていました。入力接続しか使わないので気に入っています。

CharSequence selectedText = inputConnection.getSelectedText(0);
if (TextUtils.isEmpty(selectedText)) {
    // no selection, so delete previous character
    inputConnection.deleteSurroundingText(1, 0);
} else {
    // delete the selection
    inputConnection.commitText("", 1);
}

入力接続がデフォルトの方法を使用している限りBaseInputConnection.deleteSurroundingText、これで問題ありません。ただし、ドキュメントには警告 があることに注意してください。

IME 作成者: サロゲート ペアの半分だけを削除しないように注意してください。また、アプリケーションに悪影響を与える可能性があるため、エディタ内にあるよりも多くの文字を削除しないように注意してください。

一部のカスタム ビューで、テキストの長さやサロゲート ペアを正しくチェックしない入力接続が使用されている場合、クラッシュが発生する可能性があります。これはありそうもないシナリオですが、このソリューションを使用する場合は、ここに追加のチェック コードを追加する必要があります。

これが、サンプルの Android キーボードが構成スパンがあるかどうかを最初に確認し、ない場合は次のソリューションを使用する理由である可能性があります。

解決策 2

入力接続を使用して を送信することもできKeyEventますKEYCODE_DEL。私の意見では、ハード キーボードを装ったソフト キーボードであるため、これはあまり良くありません。しかし、多くのキーボードはこれを行います。キーボード入力を受け入れるカスタム ビューを作成していたとき、削除を としてKeyEvent、つまり入力接続とは別に処理する必要がありました (入力接続はテキストを削除していないため)。

そのため、削除メッセージを として送信するだけKeyEventです (ハード キーボードのキーを押し下げて離したかのように)。

getCurrentInputConnection().sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN,KeyEvent.KEYCODE_DEL));
getCurrentInputConnection().sendKeyEvent(new KeyEvent(KeyEvent.ACTION_UP,KeyEvent.KEYCODE_DEL));

これは期待どおりに機能します。選択がある場合は選択を削除し、選択がない場合はカーソルの後ろの 1 文字を削除します。(ただし、構成スパンは個別に処理する必要があります。)

アイデアに対するこの回答に感謝します。

于 2017-07-19T06:22:50.477 に答える
8

電話getCurrentInputConnection().commitText("",1);

于 2014-12-25T16:08:13.500 に答える