正如标题所示,我的应用中的LinearLayout
随机闪烁。很难复制并且难以同时获取屏幕截图。所以请耐心等待。我只能通过拍照来拍摄它。以下是LinearLayout的预期行为(请注意红色标题下方的白色框):
现在这里是与LinearLayout相同的页面,白色背景消失了:
发生这种情况有两种情况。首先,页面完全加载后。第二,在笑脸上做拖拽事件的时候。
为了解决这个问题,我尝试使用Android Studio的代码分析功能来获取有关如何进一步优化此页面的xml布局的建议。它给出的建议是:缺少图像上的contentDescription
属性,支持从右到左布局的对齐选项,在LinearLayout上设置baselineAligned="false"
以获得更好的性能。
我为所有的LinearLayouts添加了baselineAligned="false"
选项但没有任何反应。
在SO的先前帖子中,this是我能得到的最接近的帖子。但是,LinearLayout的cache
选项似乎没有帮助。您是否认为LinearLayout的优化与ListView所描述的here的优化程度相同?最重要的是,我该如何解决这个问题?
编辑:
root.getViewTreeObserver().addOnGlobalLayoutListener(
new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
mWindowManager.updateViewLayout(mRootView,
mLayoutParams);
}
});
为了提供更多上下文,此应用程序是使用具有UI的服务实现的。屏幕截图中的页面是一项服务。 (请不要问我为什么。我刚加入团队,原来的程序员已经离开了。)
更新:我发现了这个问题!万岁!因此,当页面加载时,第一个文本框会自动获得焦点。当我在文本字段上禁用自动对焦时,问题不再发生。有人可以告诉我为什么吗?
答案 0 :(得分:1)
我很确定mWindowManager.updateViewLayout(mRootView, mLayoutParams);
再次触发了GlobalLayout()方法,因为updateViewLayout改变了布局,并且在onGlobalLayout()的文档中它说:
当全局布局状态或者调用时要调用的回调方法 视图树中视图的可见性发生变化。
因此,请尝试在root.getViewTreeObserver().removeGlobalOnLayoutListener(this);
之前添加mWindowManager.updateViewLayout(mRootView, mLayoutParams);
,以避免重复调用相同的方法。
更新: 它在焦点上发生的原因是因为当TextView获得焦点时它会改变背景,有时也会改变大小,因此调用onGlobalLayout。如果你删除了听众,一切都应该没问题。
答案 1 :(得分:0)
我不知道,但添加String
有帮助。我为我的布局添加了这个,其中包含可编辑的字段,例如
String