getExtractedText在android上处于非活动状态的InputConnection警告

我在我的logcat中得到以下警告。

getExtractedText on inactive InputConnection 

我无法find背后的原因。 请帮忙

我遇到了类似的问题。 我的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视图用户键入。 当用户按下button时,EditText被清除。 当我快速按下button时,会出现许多不活动的InputConnection条目。

例如:

 editText.setText(null); 

上面的logcat中的最后一行提供了正在发生的事情的一个很好的指示。 果然,InputConnection被请求清除文本所压倒。 我试图修改代码来检查文本的长度,然后试图清除它:

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

这有助于缓解由于按下button而不再导致IInputConnectionWrapper警告stream的问题。 然而,当用户在input内容和按下button之间快速交替或者在应用程序负载足够时按下button时,这仍然是个问题。

幸运的是,我find了另一种清除文本的方法: Editable.clear() 。 有了这个,我根本没有得到警告:

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

请注意,如果您希望清除所有input状态而不仅仅是文本(自动文本,autocap,multitap,撤消),则可以使用TextKeyListener.clear(可编辑的e) 。

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

更新:

我得到InputConnection警告的原因不是因为我在哪里设置文本(即在onTextChangedcallback,或afterTextChanged ) – 这是因为我使用setText

我通过打电话来解决这个问题:

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

注意:我仍然在afterTextChangedcallback中进行调用,尽pipe它没有来自ontextChanged警告。

先前的回答:

我在logcat中也得到了相同的消息,虽然我的情况稍有不同。 我想读取进入EditText(或组成字符/粘贴文本)的每个字符,然后将有问题的EditText重置为默认的初始化string。

明文部分按照约翰逊的解决scheme进行工作。 但是,重置文本是有问题的,我会得到input连接警告。

最初,我的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)的callback是设置文本的正确位置。

 @Override public void afterTextChanged(Editable s) { if (isResettingKeyboard) return; resetKeyboardString(); // ... } 

到目前为止,这是没有任何警告的。

从帮助文件

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

InputConnection接口是从InputMethod返回到正在接收input的应用程序的通信通道。 它用于执行诸如读取光标周围的文本,将文本提交到文本框以及将原始键事件发送到应用程序等。

另外,进一步阅读表明

getExtractedText():如果input连接失效(例如进程崩溃)或客户端花费太多时间回复文本(返回给定几秒 ),则此方法可能会失败。 无论哪种情况,都会返回null。

它似乎也监视这些文本的变化,并提醒变化。

为了解决这个问题,你将不得不探索你正在做的任何数据库查询,也许围绕着一个布局中的listViews或列表。

如果你没有任何意见,例如它在后台随机发生,那么我会build议它不是一个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(); } 

为自己解决这个问题也许你有同样的问题。

这是由List AdapterHeaderView中的对象引起的。

我膨胀了一个视图,并宣布对象,并把它放在一个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 } }); 

将它添加到列表适配器并构build适配器。

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

Text Watcher工作的一切都很好。

但是如果我在初始构build之后重build了适配器的话。

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

HeaderView也被重build了。

该警告将显示,因为该对象被删除,并且文本观察者仍然在注意它。

列表适配器对象被replace,我猜文本看守者正在寻找另一种方式,当它发生。

所以警告消失了,奇迹般的文本观察者发现了HeaderViewObject 。 但它失去了重点和logging警告。

运用

 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修改或者获取文本时,我遇到了这个问题,而且它很专注。

所以,在修改或获取之前,我closures了键盘,然后修复它。

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

也许,你的问题是不一样的。

我已经解决了我的问题,像这样在xml中插入inputtypes:android:inputType =“none | text | textCapWords | textUri”

之前是android:inputType =“text”这解决了我的问题。