错误总结
EditText
在RecyclerView
中被回收后,它的长按行为,用于选择所有文本,并显示上下文菜单“剪切/复制/粘贴”,不再按预期工作。
从Android 15到Android 28都会出现这个问题。
我尝试了 EditText
和 android.support.v7.widget.AppCompatEditText
。两者都会产生同样的问题。
我可以确认这个问题发生在 View
被回收之后。如果我在 ViewHolder
中应用 setIsRecyclable(false);
,就不会出现这个问题。
重现步骤
- 长按第一个
EditText
。我们可以确认EditText
中的所有文本都将被选中。将显示上下文菜单。 - 滚动
RecyclerView
直到列表末尾。 - 滚动
RecyclerView
直到列表的开头。 - 长按第一个
EditText
。EditText
中的所有文本都不会被选中。不会显示上下文菜单。
预期行为
在 View 被回收后,我们预计第 4 步的行为仍将与第 1 步完全相同。
源代码
https://github.com/yccheok/edittext_bug_in_android9
问题跟踪器
https://issuetracker.google.com/issues/125425940
我想知道,有没有人遇到和我一样的问题?您对此有什么好的解决方法吗?请注意,我需要我的 RecyclerView
项目是可回收的。因此,使用 setIsRecyclable(false);
不是我的选择。
最佳答案
简而言之,问题的发生是因为 EditText
在 attachToWindow
期间没有执行 Editor#prepareCursorControllers
。
由于 Editor#prepareCursorControllers
不是公共(public)可访问函数,我们可以使用 setCursorVisible
间接调用它。
edtImgDesc.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
@Override
public void onViewAttachedToWindow(View v) {
edtImgDesc.setCursorVisible(false);
edtImgDesc.setCursorVisible(true);
}
@Override
public void onViewDetachedFromWindow(View v) {
}
});
引用来源:https://www.jianshu.com/p/e334134a4ef7 (博客是中文的)
关于android - 在 RecyclerView 中回收 View 后,EditText(或 android.support.v7.widget.AppCompatEditText)长按损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54833004/