Androidの非アクティブなInputConnection警告に対するgetExtractedText


127

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

getExtractedText on inactive InputConnection

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


4
この質問のあいまい/あいまい/不完全な内容がわかりません。アプリの実行中にこの警告がlogcatに表示されます。この警告の理由を知りたいのですが。
pankajagarwal 2012年

2
私は自分が開発しているアプリケーションでもこれを使用していますが、それがどこから来たのか、またその理由はわかりません。誰かが見つけた場合は、コメントを投稿してください。実際には、「getExtractedText」以外のさまざまな警告が表示されます。「beginBatchEdit」、「endBatchEdit」、「getTextBeforeCursor」なども表示されます。
スパン

1
モデレーターはこの質問を見ています。彼らはまだ漠然としてamibiguous後でも14 upvotesとして、この質問を信じるならば、彼らは、私が言うことを知らないはずだからではない、その後場合
pankajagarwal

私も同意します。これは私が取り組む必要のある問題でもあります。原因はわかりません。
JonWillis 2012

3
このエラーの原因となっているコードは何ですか?
リザードに請求

回答:


44

私は同様の問題に遭遇しました。私の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());
}

1
IInputConnectionWrapperの警告も表示され、私のアプリはほぼANRを取得しました。メソッドclear()が機能しました... setText( "")を設定する前に、非常に奇妙なバグが発生しました。
ボックス

17

更新:

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

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

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

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

以前の答え:

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

クリアテキスト部分は、上記のJohnsonのソリューションに従って機能します。ただし、テキストのリセットには問題があり、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();

    // ... 
}

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


私も同じ問題を抱えていました。私が気付いたのは、あなたのソリューションではInputConnection警告が消えるが、afterTextChangedメソッドがとhiddenKeyboardText.getText().clear();同様に呼び出されることに気づき hiddenKeyboardText.append("some string");、この事実も考慮する必要があるということです。私からの+1!
Nick

@Nick true-確認することif (isResettingKeyboard) return;が重要です...
ahash

7

ヘルプドキュメントから

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

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

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

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

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

問題を突き止めるには、おそらくレイアウト内のlistViewsまたはリストの周りで、行っているデータベースクエリを調査する必要があります。

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

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

私はあなたがこれについて誰か他の人がメッセージをログに記録するような特定の何かを書いていない場合、またはおそらくあなたが使用しているライブラリのそれを推測すると危険だと思いますか?


1
おかげで、dbクエリを実行しましたが、奇妙なことに、エミュレーターでアプリを実行しているときにこの警告が表示されないため、実際にデバイスにインストールされている他のアプリが原因である可能性があります。この方向を検討します
pankajagarwal

最新のlogCatは、フィルターされた他のアプリとは異なるメッセージを表示すると思います。それを確認するのに十分なほどそれを使用していません。新しい空のアプリを作成し、ログ猫を見てエラーが発生するかどうかを確認すると、アプリが削除されます。問題であることから。
エミール

@friezaは必ずしも他のアプリではありません。私はsqliteでArrayAdapterを追加し、電話でもこの警告を受けています。エミュレータでエラーが発生しないのは、遅いため、結果としてパフォーマンスしきい値が無効になっているためです。
alandarev 2014年

7

私も同じ問題を抱えていました。私の1人でソフトキーボードがアクティブ化され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();
}

2
これが正解です。現在画面上にあるアクティビティから切り替える前に、キーボードを非表示にしてください。
ガーボル

1

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

これはによって引き起こされたオブジェクトHeaderView一覧アダプター

ビューを膨らませてオブジェクトを宣言し、それに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
        }
});

リストアダプターに追加し、アダプターを作成しました。

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

Text Watcherが機能することはすべて問題ありません

しかし、最初のビルド後にアダプタを再構築した場合は。

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

そのHeaderViewも再構築されます。

その警告は、オブジェクトが削除され、Text Watcherがまだ監視しているために表示されます。

リストアダプタ、オブジェクトは置き換えられた、と私は推測しているウォッチャーは、テキストを、それが起こったときに、他の方法を探していました。

そのため、警告が鳴り奇妙なことに、Text WatcherHeaderViewObjectを見つけます。しかし、それはフォーカスを失い、その警告をログに記録します。

使用する

JOBSadapter.notifyDataSetChanged();

問題を修正しました。

しかし、あなたが持っている場合は、オブジェクトの内部アダプタ、およびテキストをウォッチャーがに接続されているオブジェクトの内部アダプタ。次に、もう少し作業が必要になる場合があります。

リスナーを削除してみて、あなたがしているかもしれないどんな仕事をした後でもそれを再び付けてください。

Object.removeTextChangedListener();

または

Object.addTextChangedListener(null);

1

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

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
     }
});

0

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

そこで、変更または取得する前に、キーボードを閉じて修正しました。

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

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


0

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

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


3
私には何もしませんでした。
DSlomer64 2017年

0

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

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


0

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

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


0

テキストが変更されるたびに入力の検証を実行していて、場合によってはビューを非表示にする必要があるため、私の問題はEditTextto の可視性をGONE設定しVISIBLE、ユーザーが文字を入力するたびにそれをすぐに設定することによって引き起こされました。

したがって、解決策は、UIまたは状態の更新の間にビューまたはレイアウトの可視性をGONEに設定しないようにするEditTextことです。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.