android上的非活动InputConnection警告的getExtractedText

时间:2011-11-14 13:56:16

标签: java android logcat

我在logcat中收到以下警告。

getExtractedText on inactive InputConnection

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

14 个答案:

答案 0 :(得分:41)

我遇到了类似的问题。我的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 :(得分:14)

更新:

我收到InputConnection警告的原因不是因为我在设置文本的位置(即onTextChanged回调或afterTextChanged) - 这是因为我正在使用{{ 1}}。

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

setText

注意:我仍在hiddenKeyboardText.getText().clear(); hiddenKeyboardText.append("some string"); 回调中拨打电话,但它也可以在afterTextChanged没有警告的情况下运行。

上一个回答:

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

明文部分按照Johnson的解决方案工作。但是,重置文本是有问题的,我会收到输入连接警告。

最初,我的ontextChanged定义如下:

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; } 时,EditText处于只读模式。我不确定这是否意味着我们不能在其上调用onTextChanged(...)getText.clear()调用也会产生inputConnection警告)。

但是,回调setText(...)是设置文本的正确位置。

afterTextChanged(Editable s)
到目前为止,这是在没有任何警告的情况下工作的。

答案 2 :(得分:7)

来自帮助文档

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

  

InputConnection接口是来自的通信通道   InputMethod回到正在接收其输入的应用程序。它是   用于执行诸如在光标周围阅读文本之类的事情,   将文本提交到文本框,并将原始键事件发送到   应用

此外,进一步阅读显示

  

getExtractedText():   如果输入连接变为无效,则此方法可能会失败   (例如它的进程崩溃)或客户端花了太长时间   回复文本(返回时间为几秒钟)。在   无论是哪种情况,都会返回null。

它似乎还会监控此类文本的更改,并提醒更改。

要解决问题,你必须探索你正在进行的任何数据库查询,可能是在listViews或布局列表中。

如果您没有任何视图,例如它在后台随机发生,那么我会建议它不是UI元素问题,所以忽略文本字段等。它可以是将信息存储在游标中或请求游标的后台服务。

此外,您的应用是否会出现此问题?或者也许是你最近安装的其他人。列出完整的logCat跟踪。有人可能会认识到这个问题。

我猜想如果你没有写一些具体的东西,它的某个人会记录消息,或者你使用的是某个库的消息吗?

答案 3 :(得分:7)

我遇到了同样的问题。在我的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();
}

答案 4 :(得分: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 也会重建。

该警告会显示,因为对象已删除,而文本观察器仍设置为正在观看。

列表适配器对象已被替换,我猜测文本观察器正在寻找相反的方式

警告响起,奇迹般地文本观察器找到 HeaderView 对象。但它会失去焦点并记录警告。

使用

JOBSadapter.notifyDataSetChanged();

解决了这个问题。

但是如果适配器中有对象,并且文本观察器附加到< 适配器内的strong>对象。那么你可能需要做更多的工作。

尝试删除监听器并在完成您正在做的任何工作后再次附加它。

Object.removeTextChangedListener();

Object.addTextChangedListener(null);

答案 5 :(得分:1)

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

答案 6 :(得分:1)

...我不知道我是如何在构建下初始化我的控制器的;但我做到了。

 `Widget build(BuildContext context) {
 final _formKey = GlobalKey<FormState>();
 final prodName = TextEditingController();
 final prodDesc = TextEditingController();
 final prodPrice = TextEditingController();
 ...` 

代替

`final _formKey = GlobalKey<FormState>();
 final prodName = TextEditingController();
 final prodDesc = TextEditingController();
 final prodPrice = TextEditingController();
 ...
 Widget build(BuildContext context) {`

当然,在我将控制器和 GlobalKey 正确放置到我的表单后,一切都消失了(正如预期的那样)!

答案 7 :(得分:0)

当我不得不修改或从EditText获取文本时,我遇到了这个问题,而且它已经集中了。

因此,在修改或从中获取之前,我关闭键盘并修复它。

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

也许,你的问题不同了。

答案 8 :(得分:0)

我解决了在xml上插入输入类型的问题,如下所示: 机器人:的inputType = “无|文本| textCapWords | textUri”

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

答案 9 :(得分:0)

Logcat中的错误:getTextBeforeCursor在非活动的InputConnection上

解决方案:隐藏输入键盘并运行应用程序。

答案 10 :(得分:0)

在清除EditText之前隐藏软件键盘-警告不会显示。

此外,它似乎是特定于设备的。我仅在Nexus 4(Android 7.1)上看到它。在模拟器(8.0、7.1)或Nexus 5上没有警告。

答案 11 :(得分:0)

我的问题是由于将EditText的可见性设置为GONE,然后在每次用户键入字符时立即将其设置为VISIBLE所致,因为我正在每次更改文本时都会输入,在某些情况下需要隐藏视图。

因此,解决方案是避免在UI或状态更新之间将视图或布局的可见性设置为GONE,因为EditText可能会失去焦点

答案 12 :(得分:0)

面对同样的问题,并通过将我的无状态窗口小部件转换为有状态的窗口小部件来解决它

答案 13 :(得分:0)

它有一个非常简单的修复。 每当使用 Textformfield 时,只需设置 autofocus==true。 为我工作!