如标题所示,我的应用程序中的 LinearLayout
随机闪烁。很难复制,也很难同时获得截图。所以请多多包涵。我只能通过拍照来捕捉它。这是 LinearLayout 的预期行为(注意红色标题下方的白框):
现在这是使用 LinearLayout 的同一页面,其中白色背景消失了:
发生这种情况有两种情况。首先,在页面完全加载之后。其次,在对笑脸执行拖动事件时。
为了修复它,我尝试使用 Android Studio 的代码分析功能来获取有关如何进一步优化此页面的 xml 布局的建议。它给出的建议是:缺少图像上的 contentDescription
属性、支持从右到左布局的对齐选项、在 LinearLayout 上设置 baselineAligned="false"
以获得更好的性能。
我为我的所有 LinearLayouts 添加了 baselineAligned="false"
选项,但没有任何反应。
在以前的帖子中,this是我能得到的最接近的。然而,LinearLayout 的那些 cache
选项似乎没有帮助。您是否认为 LinearLayout 的优化也像 ListView 所描述的那样 here ?最重要的是,我该如何解决这个问题?
编辑:
root.getViewTreeObserver().addOnGlobalLayoutListener(
new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
mWindowManager.updateViewLayout(mRootView,
mLayoutParams);
}
});
为了提供更多上下文,此应用是使用具有 UI 的服务实现的。屏幕截图中的页面是一项服务。 (请不要问我为什么,我刚加入团队,原来的程序员已经离开了。)
更新:我发现了问题!万岁!因此,当页面加载时,第一个文本框会自动获得焦点。当我在我的文本字段上禁用自动对焦时,问题不再发生。谁能告诉我为什么?
最佳答案
我很确定 mWindowManager.updateViewLayout(mRootView, mLayoutParams);
再次触发 onGlobalLayout() 方法,因为 updateViewLayout 改变了布局,在 onGlobalLayout() 的文档中它说:
Callback method to be invoked when the global layout state or the visibility of views within the view tree changes.
因此请尝试在 mWindowManager.updateViewLayout(mRootView, mLayoutParams);
之前添加 root.getViewTreeObserver().removeGlobalOnLayoutListener(this);
以避免重复调用同一方法。
更新: 它发生在焦点上的原因是因为当 TextView 获得焦点时它会改变背景,有时还会改变大小,所以 onGlobalLayout 被调用。如果您删除监听器,一切都应该没问题。
关于android - LinearLayout 随机闪烁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40240500/