ClearableEditText - 在Android 4.3上不正确地调用requestLayout()

and*_*idu 8 error-handling android android-edittext droidparts

我实现了ClearableEdittext,它的工作方式非常完美,除了在4.3这里logcat充满了我:

W/View(16611): requestLayout() improperly called by com.[myPackage].ui.widgets.ClearableEditText{42233dd0 VFED..CL .F....ID 0,0-708,88 #7f050127 app:id/SearchEdittext} during layout: running second layout pass
W/View(16611): requestLayout() improperly called by com.[myPackage].ui.widgets.ClearableEditText{42233dd0 VFED..CL .F....ID 0,0-708,88 #7f050127 app:id/SearchEdittext} during layout: running second layout pass
W/View(16611): requestLayout() improperly called by com.[myPackage].ui.widgets.ClearableEditText{42233dd0 VFED..CL .F...... 0,0-708,88 #7f050127 app:id/SearchEdittext} during second layout pass: posting in next frame
Run Code Online (Sandbox Code Playgroud)

当在edittext中输入时,不会显示任何文本.此后,在开始泛滥logcat之后,除了软键盘之外,UI也会被冻结.

在internetz上找不到任何关于此的信息.并且requestLayout()必须在Edittext/Textview类中调用,因为我从不调用它.你们中的任何人都知道如何解决这个或导致错误的原因吗?

EDIT1好的,所以如果我注释掉这条线,问题就会消失:

setCompoundDrawables(getCompoundDrawables()[0], getCompoundDrawables()[1], x, getCompoundDrawables()[3]);
Run Code Online (Sandbox Code Playgroud)

我尝试将此作为runnable发布到视图的UI队列,但没有显示任何文本.

EDIT2我看过这个 Android开发者的视频,解释了一些递归事件正在发生onLayout,但再一次,我只是子类EditText.

EDIT3我也尝试丢弃复合drawable并ImageView在其上面使用另一个EditText但是它与布局传递有关,当Edittext我在相信的时候绘制一些东西...递归调用仍在发生并阻止UI.不知道接下来要尝试什么...... 4.3 sux

EDIT4我最终使用了具有水平方向的线性布局和用于组件背景的自定义9补丁绘图.在布局中,我有一个普通的edittext和我的自定义9patch Bg,然后是一个带有另一个自定义9patch Bg的ImageButton.

像这样的东西:

在此输入图像描述

红线从ImageButton界定Edittext.它现在适用于4.3

Ken*_*eth 1

回复有点晚了,但我刚刚遇到了与 ClearableEditText 组件相关的问题。

看来,由于setClearIconVisible()中compounddrawables的变化,触发了onfocus事件的永恒循环。

我将 setClearIconVisible 更改为仅在有任何实际更改时才更改可绘制对象。

   protected void setClearIconVisible(boolean visible) {
        boolean wasVisible = getCompoundDrawables()[2] != null;
        if(wasVisible == visible) return;

        setCompoundDrawables(oldDrawables[0], oldDrawables[1], x, oldDrawables[3]);
        setCompoundDrawablePadding(oldPadding);
    }
Run Code Online (Sandbox Code Playgroud)

这解决了我的键盘没有重新出现的问题。焦点事件的永恒循环不会给任何人带来任何好处。它仍然添加了另一轮布局和focusedChanged,因此可能有更聪明的解决方案。不过,我还可以再打一轮。

我还向开发人员发送了拉取请求,https://github.com/yanchenko/droidparts/pull/31