Android上无效的InputConnection上的getExtractedText警告


127

我在logcat中收到以下警告。

getExtractedText on inactive InputConnection

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


4
我不明白这个问题中什么是模棱两可/模糊/不完整?运行我的应用程序时,我在logcat中收到此警告,我想知道此警告的原因。
pankajagarwal 2012年

2
我还在开发中的应用程序中注意到了这一点,我不知道它来自哪里或为什么。如果有人发现,请发表评论。实际上,除“ getExtractedText”外,它还显示许多其他警告。我还看到:“ beginBatchEdit”,“ endBatchEdit”,“ getTextBeforeCursor”等等。
2012年

1
主持人正在看这个问题。如果不是这样的话,他们应该这样做,因为即使经过14次投票,他们仍然认为这个问题仍然含糊不清,我不知道该说些什么
pankajagarwal

我同意,这也是我也需要解决的问题。我不知道原因。
乔恩·威利斯(JonWillis)

3
您使用什么代码导致此错误?
比尔蜥蜴2012年

Answers:


44

我遇到了类似的问题。我的日志:

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());
}

1
我也收到了IInputConnectionWrapper警告,我的应用几乎得到了ANR,方法clear()对我有用...超级奇怪的错误,在我设置setText(“”);之前。
盒子

17

更新:

我收到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();

    // ... 
}

到目前为止,这是在没有任何警告的情况下进行的。


我也有同样的问题。我意识到的是,虽然你的解决方案使消失InputConnection警告,我注意到, afterTextChanged方法被调用hiddenKeyboardText.getText().clear();,以及上hiddenKeyboardText.append("some string");,这一事实也应加以考虑。向我+1!
尼克

@Nick true –重要的是要确保if (isResettingKeyboard) return;
头上

7

从帮助文件

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

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

此外,进一步阅读显示

getExtractedText():如果输入连接已变得无效(例如其进程崩溃),或者客户端花费太多时间来响应文本(给出几秒钟的返回时间),则此方法可能会失败 。无论哪种情况,都将返回null。

它似乎还监视对此类文本的更改,并发出警报更改。

为了解决这个问题,您必须探索正在进行的任何数据库查询,可能围绕listViews或布局中的列表。

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

另外,问题是否出自您的应用?或您最近安装的其他人。列出完整的logCat跟踪。有人可能会意识到这个问题。

我想冒一个猜想,如果您尚未针对此内容编写其他人的日志消息,或者您正在使用的库的消息?


1
谢谢,我确实进行了数据库查询,但奇怪的是,在模拟器上运行该应用程序时未显示此警告,因此实际上可能是由于我的设备上安装了其他应用程序所致。会朝这个方向发展
pankajagarwal

我认为最新的logCat可以向您显示与其他应用程序截然不同的消息。尚未充分使用它来确认这一点。您可以创建一个新的空应用程序,然后观察日志猫以查看是否发生错误,这将消除您的应用程序。成为问题。
Emile

@frieza不一定是其他应用程序。我添加了带有sqlite的ArrayAdapter,现在也在手机上收到此警告。我猜您在模拟器上看不到任何错误是因为它运行缓慢并且因此禁用了性能阈值。
alandarev 2014年

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();
}

2
这是正确的答案。在退出当前屏幕上的活动之前,请确保隐藏键盘。
加博尔

1

为自己解决了这个问题,也许您也遇到了同样的问题。

这是由列表适配器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过重修。

之所以会显示该警告,是因为删除了对象,并且仍设置了文本监视程序来监视它。

列表适配器对象进行了更换,我猜文本观察者一直在寻找其他的方式,当它发生了。

因此,警告消失了,奇迹般地,文本监视程序找到了HeaderViewObject。但是它失去了重点并记录了该警告。

使用

JOBSadapter.notifyDataSetChanged();

解决了这个问题。

如果你有一个对象的内部适配器文本看守附着在物体适配器。然后,您可能需要做更多的工作。

尝试完成所有工作后,尝试删除侦听器并再次附加它。

Object.removeTextChangedListener();

要么

Object.addTextChangedListener(null);

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

0

当我不得不修改或从EditText获取文本时,我遇到了这个问题。

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

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

也许,您的问题有所不同。


0

我已经解决了在xml上插入输入类型的问题,例如:android:inputType =“ none | text | textCapWords | textUri”

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


3
没为我做任何事。
DSlomer64

0

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

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


0

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

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


0

我的问题是由于将设置EditTextGONE,然后立即将其设置为VISIBLE每次用户键入字符时为,这是因为每次文本更改时我都会在输入上运行验证,并且在某些情况下需要隐藏视图。

因此,解决方案是避免在用户界面或状态更新之间将“视图”或“布局”的可见性设置为“消失”,因为这EditText可能会失去焦点


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.