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警告的原因不是因为我在哪里设置文本(即在onTextChanged
callback,或afterTextChanged
) – 这是因为我使用setText
。
我通过打电话来解决这个问题:
hiddenKeyboardText.getText().clear(); hiddenKeyboardText.append("some string");
注意:我仍然在afterTextChanged
callback中进行调用,尽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 Adapter的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 } });
将它添加到列表适配器并构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,我猜文本看守者正在寻找另一种方式,当它发生。
所以警告消失了,奇迹般的文本观察者发现了HeaderView和Object 。 但它失去了重点和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”这解决了我的问题。
- 在Spring Webservice中,不能从START_ARRAY标记反序列化对象的实例
- GLSurfaceView里面片段重新启动时不能渲染
- 如何获得安装的Android应用程序的列表,并select一个运行
- Android Studio 0.4复制在APK META-INF / LICENSE.txt中复制的文件
- Android 5.0 – 添加页眉/页脚到RecyclerView
- Gradle buildConfigField BuildConfig无法parsing符号
- 使用RecyclerView适配器更新数据的最佳方法
- Android 2.2 MediaPlayer可以正常工作,只有一个SHOUTcast URL,但不能用另一个SHOUTcast URL
- Android中的多表SQLite数据库适配器?