私はEditText
を持っています。今私はEditText
にユーザーによって加えられたすべての変更を手に入れてから、EditText
に手作業で挿入する前に作業したいと思います。私はユーザーがEditText
のテキストを直接変更しないようにしたい。これは自分のコードでのみ行う必要があります(例:replace()
またはsetText()
を使用)。InputConnectionWrapperの使い方は?
少し調べて、InputConnectionWrapper
という面白いクラスが見つかりました。 javadocによれば、それは指定されたInputConnection
のプロキシとして動作します。
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
InputConnection con = super.onCreateInputConnection(outAttrs);
EditTextInputConnection connectionWrapper = new EditTextInputConnection(con, true);
return connectionWrapper;
}
しかし、commitText()
が呼ばれることは決してありません:私は私のEditText
-subclassで次のメソッドを上書きラッパーを初期化するには
private class EditTextInputConnection extends InputConnectionWrapper {
public EditTextInputConnection(InputConnection target, boolean mutable) {
super(target, mutable);
}
@Override
public boolean commitText(CharSequence text, int newCursorPosition) {
// some code which takes the input and manipulates it and calls editText.getText().replace() afterwards
return true;
}
}
:だから私はこのようにそれをサブクラス化。 onCreateInputConnection()
が呼び出され、EditTextInputConnection
というコンストラクタも呼び出されますが、commitText()
というフィールドには何らかのテキストを入力する必要があります。少なくとも、それは私がInputConnectionWrapper
の使用法を理解する方法です。または私は間違っていますか?
編集:「 『commitText()
のみなどの特殊文字のために呼ばれていること、と思われる、』」など私が呼ばれるべきInputConnectionWrapper.sendKeyEvent()
他のすべての文字のAndroidのソースコードを理解し、それはケースではありませんと...私は絶対にこの時点で立ち往生しています。私はすでにEditText.onKeyPreIme()
を試しましたが、これはハードウェアキーボードでのみ機能します。だから、それは別の方法ではありません...私は、Androidがハードウェアキーボードとは異なるソフトキーボードを扱う理由を本当に理解していません。 EditText.onTextChanged()
もユーザー以外の入力でも処理されるため、これも私が探しているものではありません。
これは、ランダムなテキストをコピーしてEditTextに貼り付けるのを妨げるものではありません。 – Alexey
@Alexeyそれは正しい、良い点だ。 – ubuntudroid
@ubuntudroidこんにちは、どのメソッドをすべての入力をキャプチャするために上書きする必要があるか分かりますか?コピー貼り付けを含む。 –