logcatで次の警告が表示されます。
getExtractedText on inactive InputConnection
その背後にある理由を見つけることができません。助けてください
logcatで次の警告が表示されます。
getExtractedText on inactive InputConnection
その背後にある理由を見つけることができません。助けてください
回答:
私は同様の問題に遭遇しました。私の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());
}
更新:
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();
// ...
}
これまでのところ、警告なしで機能しています。
afterTextChanged
メソッドがとhiddenKeyboardText.getText().clear();
同様に呼び出されることに気づき hiddenKeyboardText.append("some string");
、この事実も考慮する必要があるということです。私からの+1!
if (isResettingKeyboard) return;
が重要です...
ヘルプドキュメントから
http://developer.android.com/reference/android/view/inputmethod/InputConnection.html
InputConnectionインターフェイスは、InputMethodから、その入力を受け取っているアプリケーションに戻る通信チャネルです。カーソル周辺のテキストの読み取り、テキストボックスへのテキストのコミット、アプリケーションへの生のキーイベントの送信などを実行するために使用されます。
さらに、さらなる読書ショー
getExtractedText():このメソッドは、入力接続が無効になった(プロセスがクラッシュしたなど)か、クライアントがテキストで応答するのに時間がかかりすぎている場合(返されるまで数秒かかる)に失敗する可能性があります 。どちらの場合も、nullが返されます。
また、このようなテキストの変更と警告の変更を監視しているようです。
問題を突き止めるには、おそらくレイアウト内のlistViewsまたはリストの周りで、行っているデータベースクエリを調査する必要があります。
ビューがない場合、たとえばバックグラウンドでランダムに発生している場合は、UI要素の問題ではないので、テキストフィールドなどは無視してください。カーソルに情報を格納したり、カーソルを要求したりするバックグラウンドサービスである可能性があります。
また、問題はアプリから発生しますか?またはおそらくあなたが最近インストールした他の誰かです。完全なlogCatトレースをリストします。誰かが問題を認識している可能性があります。
私はあなたがこれについて誰か他の人がメッセージをログに記録するような特定の何かを書いていない場合、またはおそらくあなたが使用しているライブラリのそれを推測すると危険だと思いますか?
私も同じ問題を抱えていました。私の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();
}
私自身がこの問題を解決したので、同じ問題があるかもしれません。
これはによって引き起こされたオブジェクトで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 WatcherはHeaderViewとObjectを見つけます。しかし、それはフォーカスを失い、その警告をログに記録します。
使用する
JOBSadapter.notifyDataSetChanged();
問題を修正しました。
しかし、あなたが持っている場合は、オブジェクトの内部アダプタ、およびテキストをウォッチャーがに接続されているオブジェクトの内部アダプタ。次に、もう少し作業が必要になる場合があります。
リスナーを削除してみて、あなたがしているかもしれないどんな仕事をした後でもそれを再び付けてください。
Object.removeTextChangedListener();
または
Object.addTextChangedListener(null);
アントニオムの答えとは別に、キーボードを非表示にした後、実行する必要がある追加のアクションが実際に実行されることを確認してください。以下のようにキーボードを非表示にしている場合:
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
}
});
次のようにxmlに入力タイプを挿入する問題を解決しました:android:inputType = "none | text | textCapWords | textUri"
以前はandroid:inputType = "text"でした。これで問題が解決しました。