LinearLayout随机闪烁

时间:2016-10-25 12:52:37

标签: android android-layout android-linearlayout

正如标题所示,我的应用中的LinearLayout随机闪烁。很难复制并且难以同时获取屏幕截图。所以请耐心等待。我只能通过拍照来拍摄它。以下是LinearLayout的预期行为(请注意红色标题下方的白色框):

enter image description here

现在这里是与LinearLayout相同的页面,白色背景消失了:

enter image description here

发生这种情况有两种情况。首先,页面完全加载后。第二,在笑脸上做拖拽事件的时候。

为了解决这个问题,我尝试使用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的服务实现的。屏幕截图中的页面是一项服务。 (请不要问我为什么。我刚加入团队,原来的程序员已经离开了。)

更新:我发现了这个问题!万岁!因此,当页面加载时,第一个文本框会自动获得焦点。当我在文本字段上禁用自动对焦时,问题不再发生。有人可以告诉我为什么吗?

2 个答案:

答案 0 :(得分:1)

我很确定mWindowManager.updateViewLayout(mRootView, mLayoutParams);再次触发了GlobalLayout()方法,因为updateViewLayout改变了布局,并且在onGlobalLayout()的文档中它说:

  

当全局布局状态或者调用时要调用的回调方法   视图树中视图的可见性发生变化。

因此,请尝试在root.getViewTreeObserver().removeGlobalOnLayoutListener(this);之前添加mWindowManager.updateViewLayout(mRootView, mLayoutParams);,以避免重复调用相同的方法。

更新: 它在焦点上发生的原因是因为当TextView获得焦点时它会改变背景,有时也会改变大小,因此调用onGlobalLayout。如果你删除了听众,一切都应该没问题。

答案 1 :(得分:0)

我不知道,但添加String有帮助。我为我的布局添加了这个,其中包含可编辑的字段,例如

String