我在logcat中收到以下警告。
getExtractedText on inactive InputConnection
我找不到背后的原因。请帮忙
我在logcat中收到以下警告。
getExtractedText on inactive InputConnection
我找不到背后的原因。请帮忙
Answers:
我遇到了类似的问题。我的日志:
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();
}
请注意,如果您希望清除所有输入状态,而不仅是清除文本(自动文本,autocap,multitap,撤消),则可以使用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跟踪。有人可能会意识到这个问题。
我想冒一个猜想,如果您尚未针对此内容编写其他人的日志消息,或者您正在使用的库的消息?
我遇到了同样的问题。当在我的其中一个中激活了软键盘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中的一个对象引起的。
我放大了一个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
}
});
将其添加到列表适配器并构建适配器。
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过重修。
之所以会显示该警告,是因为删除了对象,并且仍设置了文本监视程序来监视它。
该列表适配器和对象进行了更换,我猜文本观察者一直在寻找其他的方式,当它发生了。
因此,警告消失了,奇迹般地,文本监视程序找到了HeaderView和Object。但是它失去了重点并记录了该警告。
使用
JOBSadapter.notifyDataSetChanged();
解决了这个问题。
但如果你有一个对象的内部适配器和文本看守附着在物体内适配器。然后,您可能需要做更多的工作。
尝试完成所有工作后,尝试删除侦听器并再次附加它。
Object.removeTextChangedListener();
要么
Object.addTextChangedListener(null);
除了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
}
});
当我不得不修改或从EditText获取文本时,我遇到了这个问题。
因此,在修改或获取它之前,我关闭了键盘并进行了修复。
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
也许,您的问题有所不同。
我已经解决了在xml上插入输入类型的问题,例如:android:inputType =“ none | text | textCapWords | textUri”
在此之前是android:inputType =“ text”,这解决了我的问题。
iface同样的问题,并通过将我的无状态小部件转换为有状态的小部件来解决,您可以尝试一下