web-dev-qa-db-ja.com

androidの非アクティブなInputConnection警告のgetExtractedText

Logcatで次の警告が表示されます。

getExtractedText on inactive InputConnection

その背後にある理由を見つけることができません。助けてください

117
pankajagarwal

私は同様の問題に遭遇しました。私のlogcat:

W/IInputConnectionWrapper(21214): getTextBeforeCursor on inactive InputConnection
W/IInputConnectionWrapper(21214): getSelectedText on inactive InputConnection
W/IInputConnectionWrapper(21214): getTextBeforeCursor on inactive InputConnection
W/IInputConnectionWrapper(21214): getTextAfterCursor on inactive InputConnection
...
I/Choreographer(20010): Skipped 30 frames!  The application may be doing too much work on its main thread.

私の状況:ユーザーが入力するEditTextビューがあります。ユーザーがボタンを押すと、EditTextがクリアされます。ボタンをすばやく押すと、非アクティブなInputConnectionエントリが大量に流れます。

例:

editText.setText(null);

上記のlogcatの最後の行は、何が起こっているかを示しています。案の定、InputConnectionはテキストをクリアする要求に圧倒されます。私はそれをクリアしようとする前にテキストの長さをチェックするためにコードを修正しようとしました:

if (editText.length() > 0) {
    editText.setText(null);
}

これにより、ボタンをすばやく押すとIInputConnectionWrapper警告のストリームが発生しなくなるという問題を緩和できます。ただし、ユーザーが何かを入力してボタンを押すか、アプリに十分な負荷がかかっているときにボタンを押すなどの操作をすばやく繰り返すと、問題が発生しやすくなります。

幸いなことに、テキストをクリアする別の方法を見つけました: Editable.clear() 。これにより、警告はまったく表示されません。

if (editText.length() > 0) {
    editText.getText().clear();
}

テキスト(オートテキスト、オートキャップ、マルチタップ、元に戻す)だけでなく、すべての入力状態をクリアする場合は、 TextKeyListener.clear(Editable e) を使用できます。

if (editText.length() > 0) {
    TextKeyListener.clear(editText.getText());
}
42
Johnson Wong

更新:

InputConnectionの警告が表示された理由は、テキストを設定した場所(つまり、onTextChangedコールバック、またはafterTextChanged)が原因ではなく、setTextを使用していたためです。 。

私は電話して問題を回避しました:

hiddenKeyboardText.getText().clear();
hiddenKeyboardText.append("some string");

注:afterTextChangedコールバックで呼び出しを行っていますが、ontextChangedからの警告なしでも機能します。

前の回答:

私のシナリオは少し異なりましたが、logcatでも同じメッセージが表示されていました。 EditText(または構成文字/貼り付けられたテキスト)に入ってくるすべての文字を読み取り、問題のEditTextをデフォルトの初期化文字列にリセットしたかったのです。

クリアテキスト部分は、上記のジョンソンのソリューションに従って機能します。ただし、テキストのリセットには問題があり、inputconnectionの警告が表示されます。

最初、私のonTextChanged(CharSequence s, ...)は次のように定義されました。

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
    if (isResettingKeyboard)
        return;

    // ... do what needs to be done

    resetKeyboardString();

}

public void resetKeyboardString()
{
    isResettingKeyboard = true;

    hiddenKeyboardText.getText().clear();
    hiddenKeyboardText.setText(keyboardInitString);
    hiddenKeyboardText.setSelection(defaultKeyboardCursorLocation);

    isResettingKeyboard = false;
}

onTextChanged(...)が呼び出されると、EditTextは読み取り専用モードになります。これがgetText.clear()を呼び出す以上のことができないことを意味するかどうかはわかりません(setText(...)呼び出しはinputConnection警告も生成します)。

ただし、コールバックafterTextChanged(Editable s)は、テキストを設定する適切な場所です。

@Override
public void afterTextChanged(Editable s) {

    if (isResettingKeyboard)
        return;

    resetKeyboardString();

    // ... 
}

これまでのところ、これは警告なしに機能しています。

15
ahash

ヘルプ文書から

http://developer.Android.com/reference/Android/view/inputmethod/InputConnection.html

InputConnectionインターフェースは、InputMethodからその入力を受信して​​いるアプリケーションに戻る通信チャネルです。カーソル周辺のテキストの読み取り、テキストボックスへのテキストのコミット、生のキーイベントのアプリケーションへの送信などを実行するために使用されます。

さらに、さらなる読書ショー

getExtractedText():このメソッドは、入力接続が無効になった場合(プロセスがクラッシュするなど)、またはクライアントがテキストで応答するのに時間がかかりすぎる場合に失敗する場合があります(カップルが与えられます)戻るまでの秒数)いずれの場合も、nullが返されます。

また、このようなテキストの変更を監視し、変更を警告するようです。

問題を解決するには、おそらくlistViewやレイアウト内のリストを中心に、作成しているデータベースクエリを調べる必要があります。

たとえば、バックグラウンドでランダムに発生するビューがない場合は、UI要素の問題ではないことをお勧めします。したがって、テキストフィールドなどは無視してください。カーソルに情報を保存したり、カーソルを要求したりするバックグラウンドサービスの場合があります。

また、問題はアプリから発生しますか?または、最近インストールした他の誰かの可能性があります。完全なlogCatトレースをリストします。誰かが問題を認識するかもしれません。

このことについて特定の何かを書いていない場合、誰かがログメッセージをログに記録しているのではないか、または使用しているライブラリのログを記録しているのではないかと推測します。

7
Emile

私は同じ問題を抱えていました。 EditTextsのいずれかでソフトキーボードがアクティブになり、アクティビティがフォーカスを失うと、警告が表示されました。

OnPause()でキーボードを非表示にすることでした。

@Override
protected void onPause() {

    // hide the keyboard in order to avoid getTextBeforeCursor on inactive InputConnection
    InputMethodManager inputMethodManager = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);

    inputMethodManager.hideSoftInputFromWindow(myEditText.getWindowToken(), 0);

    super.onPause();
}
7
antoniom

アントニオムの答えとは別に、キーボードを非表示にした後、実行する必要がある追加のアクションが実際に実行されることを確認してください。したがって、以下のようなキーボードを非表示にしている場合:

public void hideKeyboard() {
InputMethodManager inputMethodManager =(InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    inputMethodManager.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), 0);
}

、次のようにキーボードを非表示にした後、後続のアクションを実行する必要があります。

getWindow().getDecorView().post(new Runnable() {            
        @Override
        public void run() {
            finish(); //Sample succeeding code
     }
});
1
Pier Betos

自分でこの問題を解決したのかもしれませんが、同じ問題があるかもしれません。

これは、List AdapterHeaderViewObjectが原因でした。

Viewを膨らませてObjectを宣言し、その上にTextWatcherを配置しました。

View v = LayoutInflater.from(CONTEXT).inflate(R.layout.in_overscrollview, null);
Object= (Object) v.findViewById(R.id.OBJECT_ID);

Object.addTextChangedListener(new TextWatcher() {
        @Override
        public void afterTextChanged(Editable s) {
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after){
        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
        //Do my work
        //Update my view
        }
});

List Adapterに追加し、アダプターを構築しました。

JobListView = (ListView) getListView().findViewWithTag("JOBLISTVIEWTAG");
JobListView.addHeaderView(v, null, false);
JobsAdapter = new IN_JOBS_ADAPTER(CONTEXT, ITEMS_FOR_ADATER);
ListView.setAdapter(JOBSadapter);

Text Watcherで問題はありません。

BUT最初のビルド後にアダプターを再ビルドした場合。

JobsAdapter = new IN_JOBS_ADAPTER(CONTEXT, DIFFERENT_ITEMS_FOR_ADAPTER);
ListView.setAdapter(JOBSadapter);

HeaderViewも再構築されます。

Objectが削除され、Text Watcherがまだ監視しているため、この警告が表示されます。

リストアダプターオブジェクトが置き換えられましたが、テキストウォッチャーが発生したときは別の方法を探していたと推測しています。

そのため、警告は消え、奇跡的にText WatcherHeaderViewObjectを見つけます。しかし、フォーカスを失い、その警告を記録します。

を使用して

JOBSadapter.notifyDataSetChanged();

問題を修正しました。

BUTObjectAdapter内にあり、Text Watcherが-に接続されている場合ObjectAdapter内。その後、もう少し作業が必要になる場合があります。

リスナーを削除して、実行している可能性のある作業をすべて実行した後、再度アタッチします。

Object.removeTextChangedListener();

または

Object.addTextChangedListener(null);
1
Xjasz

EditTextをクリアする前にソフトウェアキーボードを非表示にする-警告は表示されません。

また、デバイス固有のようです。 Nexus 4(Android 7.1)でのみ見ました。エミュレーター(8.0、7.1)またはNexus 5では警告はありません。

0
Inoy

Logcatのエラー:非アクティブなInputConnectionでのgetTextBeforeCursor

解決策:入力キーボードを非表示にして、アプリケーションを実行します。

0
shyam

次のようにXMLに入力タイプを挿入する問題を解決しました:Android:inputType = "none | text | textCapWords | textUri"

それ以前はAndroid:inputType = "text"でした。これで問題が解決しました。

0

EditTextからテキストを変更または取得する必要があり、フォーカスがあったときにこの問題が発生しました。

そのため、変更する前に、キーボードを閉じて修正します。

InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);

たぶん、あなたの問題は異なります。

0
Angelo Moroni