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

时间:2013-08-22 14:15:19

标签: android error-handling android-edittext droidparts

我实现了ClearableEdittext并且它完全正常工作,除了4.3 log log洪流我:

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

在输入edittext时没有显示任何文字。此外,在开始使用logcat之后,除了软键盘外,UI也会被冻结。

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

EDIT1 好的,如果我注释掉这一行,问题就会消失:

setCompoundDrawables(getCompoundDrawables()[0], getCompoundDrawables()[1], x, getCompoundDrawables()[3]);

我尝试将此作为runnable发布到视图的UI队列中,但不会显示任何文本。

EDIT2 我看到this video的Android开发人员在onLayout期间发现了递归的事情,但我再一次将EditText作为子类。< / p>

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

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

这样的事情:

enter image description here

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

3 个答案:

答案 0 :(得分:1)

尝试清除onFocusChange的方法。这对我有帮助

答案 1 :(得分:1)

我最终为edittextclear btn使用了2个单独的观看次数,请参阅我编辑过的问题。

答案 2 :(得分:1)

有点迟了,但我刚刚与ClearableEditText组件有一个相关的问题。

由于setClearIconVisible()中复合抽象的变化,似乎触发了onfocus事件的永久循环。

我更改了setClearIconVisible,只有在有任何真正的变化时才更改drawable。

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

        setCompoundDrawables(oldDrawables[0], oldDrawables[1], x, oldDrawables[3]);
        setCompoundDrawablePadding(oldPadding);
    }

这解决了我的问题,键盘没有再出现。一个永恒的onfocus事件循环对任何人都没有好处。它仍然增加了另一轮布局和focusChanged,因此可能有一个更聪明的解决方案。我很好,还有一轮额外的回合。

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