2011-07-08 20 views
7

私は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()もユーザー以外の入力でも処理されるため、これも私が探しているものではありません。

答えて

5

上記のInputConnectionWrapperの使用は完全に正しいことが判明しました。しかし、commitText()は、(特殊な場合を除いて)決して呼び出されません。他の方法があります。これは入力中に使用されます。これらは主にsetComposingText()sendKeyEvent()です。しかし、deleteSurroundingText()またはcommitText()のようなめったに使用されないメソッドを上書きして、ユーザ入力ごとにを確実にキャッチすることも重要です。

+1

これは、ランダムなテキストをコピーしてEditTextに貼り付けるのを妨げるものではありません。 – Alexey

+0

@Alexeyそれは正しい、良い点だ。 – ubuntudroid

+0

@ubuntudroidこんにちは、どのメソッドをすべての入力をキャプチャするために上書きする必要があるか分かりますか?コピー貼り付けを含む。 –

1

Blundellチャットでは、TextWatcherを使用することをおすすめします。これがあなたを助けるかどうか確認してください。

+0

TextWatcherの問題点は、入力ソース(キーボード入力またはコードからの直接入力)を特定できないことです。 EditText.getText()。replace()またはEditText.setText()でテキストを変更した場合は、それも通知されます。 – ubuntudroid

+0

私は確信が持てません。テストしましたか? –

+0

これは、getText()。replace()/ insert()がEditTextの背後にあるEditable上で直接的に動作するためです。編集可能な変更を追跡するTextWatcherには、編集可能な変更が通知されます。私は現在、コードからアクセスして、insert()とreplace()のメソッドを上書きするための、編集可能な特別なメソッドのサブクラスを組み込んだ別のソリューションに取り組んでいます。それが終わったら私の調査結果をここに掲載します。 – ubuntudroid

0

TextWatcherを使用して、編集テキストを変更しているときに切断し、完了したら再接続します。この方法では、無限の呼び出しをトリガーしません。