V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
scola
V2EX  ›  Android

50 红包答谢,帮解决一个 Android UI 问题

  •  
  •   scola · 2019-12-14 23:09:23 +08:00 · 11022 次点击
    这是一个创建于 1804 天前的主题,其中的信息可能已经有所发展或是发生改变。
    1. 我有一个自定义 view(A), 有一些动画效果和 textview,不停的在更新, 将 A 添加到了一个约束布局( viewgroup )
    2. 在约束布局 removeView ( A ),约束布局 set Gone,将 A 添加到 windowmanager, 显示正常
    3. 在 windowmanger 中 removeView ( A ),再次 addView 到约束布局, 约束布局 set Visibility View.VISIBLE,此时有问题, 动画不再更新,里面的 textview 也不更新,A 感觉卡住了

    requestLayout();
    invalidate();
    这些方法尝试过来,没什么用


    求大佬帮解决这个问题
    第 1 条附言  ·  2019-12-16 22:33:33 +08:00
    在同事的帮助下终于解决了

    windowmanager remove 之后不要直接 viewgroup.addview

    addview 放在 view.post 里面就可以了

    希望能帮到同样踩坑的小伙伴
    12 条回复    2019-12-16 23:38:59 +08:00
    guchengyehai1
        1
    guchengyehai1  
       2019-12-14 23:15:26 +08:00 via Android
    第一步先检查有没有添加成功并正常显示
    第二步查看 Animation 或者 Animator 有没有开始,Animator 原理看一下
    nicevar
        2
    nicevar  
       2019-12-14 23:42:42 +08:00
    就这点描述很难猜出问题所在,约束布局如果 set invisible 而不是 gone 呢?
    检查一下动画是否写的有问题,添加一下 listener 打日志观察或者观察一下动画不更新 view 的 dispatchDraw
    Rysle
        3
    Rysle  
       2019-12-15 00:20:39 +08:00
    可能遇到了 ViewGroup.mDisappearingChildren 的陷阱。
    试试在每次 removeView(A)之前,stop 掉 A 的 Animation。
    rosu
        4
    rosu  
       2019-12-15 00:24:46 +08:00 via iPhone
    最简单先看 3 动画是否开始。
    KINGOD
        5
    KINGOD  
       2019-12-15 00:31:54 +08:00
    我也遇到过 #3 类似问题,如果不先 stop(),start() 不管用,于是在动画启动的地方写的是 stop(); start(); 两条语句。

    另外建议楼主检查下 addView() invalidate() 是否是在 UI Thread 下调用的,如果是非 UI 线程,就需要 postInvalidate() / postInvalidateOnAnimation() 这些 postXXX 方法。
    scola
        6
    scola  
    OP
       2019-12-15 08:14:15 +08:00 via Android
    多谢楼上回复,感觉这个问题和动画关系不大,textview 也是不停更新的,父 view 是 windowmanager,显示正常,一旦把父 view 切换到 ViewGroup,就卡住

    A 刚 new 出来,直接添加到 viewgroup 也是没有问题的,一旦执行了切换父 view 操作,切到 viewgroup,卡住,再次切到 windowmanger 恢复正常,切到 viewgroup,卡住

    ui 相关的操作都是主线程,可以保证


    @guchengyehai1
    @nicevar
    @Rysle
    @rosu
    @KINGOD
    huoluobo
        7
    huoluobo  
       2019-12-15 09:29:48 +08:00 via Android
    动画卡住的问题之前遇到过,如果你是在资源文件中定义动画效果的话,改成代码实现动画效果试试。
    winterbells
        8
    winterbells  
       2019-12-15 10:14:43 +08:00 via Android
    打断点呢,view 的方法走进去了吗

    rxjava 的主线程不一定能更新 UI,有次遇到没有 crash,但 UI 更新不了,打印出来线程是 main,Rx 而不是 main,main

    还有一次遇到构造方法 super 错了,layout add view 没反应(自己失误,看了半天,最后用 Java 写了一遍才发现。。)

    -
    实在不行把代码发出来,光靠猜有点难
    nicevar
        9
    nicevar  
       2019-12-15 10:33:02 +08:00
    @scola 你一不提供 demo,二不仔细跟一下可能出问题的,光靠自己的瞎想和你这样描述很难解决问题,要么你就干脆点直接扔个 demo 让大家帮你看一下
    gowa
        10
    gowa  
       2019-12-15 22:12:34 +08:00 via Android
    talk is cheap show me you code
    CoderMVP
        11
    CoderMVP  
       2019-12-15 22:16:52 +08:00 via iPhone
    这种问题有可能是多次 remove 和 add,但是资源没有释放导致的。在你的自定义 view 的 onDetachToWindow()做调用动画的停止并把动画引用置空试试
    kerb15
        12
    kerb15  
       2019-12-16 23:38:59 +08:00
    UI 做多了现在基本上,如果不如预期表现,首先考虑线程问题,楼主可以注意下。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3401 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 04:41 · PVG 12:41 · LAX 20:41 · JFK 23:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.