2016-10-25 53 views
3

正如标题所示,我的应用中的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的服务来实现。截图中的页面是一项服务。 (请不要问我为什么,我刚刚加入了团队,原来的程序员已经离开了。)

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

+0

它是一个标准的LinearLayout?你如何设定其背景?它是什么背景?一个PNG?一个可绘制的子类? – natario

+0

它是一个标准的LinearLayout,其子节点动态添加。其背景是使用其XML属性android:background = @ drawable/white_round设置的,其中white_round是类型形状,而不是PNG。感谢您提供的任何建议。 – user1506104

+4

我几乎可以肯定,你正在重绘(刷新)整个布局的每一个变化。这几乎总是闪烁的原因。请粘贴部分代码以确保。 –

回答

0

我不知道,但加入android:focusableInTouchMode="true"帮助。我添加了这个我的布局,其中有可编辑的领域,如

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:focusableInTouchMode="true"> 
    ... 
    <EditText 
     android:id="@+id/editText" 
     android:layout_width="100dp" 
     android:layout_height="wrap_content" /> 
    ... 
</LinearLayout> 
1

我敢肯定,mWindowManager.updateViewLayout(mRootView, mLayoutParams);再次发射onGlobalLayout()方法,因为updateViewLayout改变布局,并为onGlobalLayout(在文档),它说:要调用

回调方法当全球布局状态或视图树内视图的可见性发生变化。

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

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

+0

在评论部分,我提到我试图删除'addOnGlobalLayoutListener()'行,但问题仍然存在。所以我认为这是别的。谢谢你的建议。 (无论如何,因为这是一个很好的分析) – user1506104