安卓Lollipop中SystemUI出现故障

20

这个错误出现在我的Nexus 5和运行Lollipop的Nexus 7上。

编辑

当我进入 Inbox > Settings > Notifications > any item and go back...时,这个错误也会发生在新的Inbox应用程序中,由Google提供...

/编辑

  • 编译版本号为21
  • 构建工具版本号为21.1.1
  • 编译使用的库为'com.android.support:appcompat-v7:21.0.2'

我有一个GalleryActivity来显示多个图像,每页一张(在ViewPager内)。 当我按下返回按钮时,有时Android的SystemUI会出现故障。

正常视图

normal

故障视图

glitched

看到视图如何重复自身,并且在系统内部?

简单的触摸事件可以恢复正常的SystemUI视图。

发生了什么?

可能类似于:


6个回答

17

设置 android:hardwareAccelerated="false" 是一种极端的解决方案,因为图形性能可能会非常差。

如果您可以确定造成此问题的视图,请更好地将其切换为软件渲染,方法是使用 setLayerType(),例如:

view.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
有趣的是,在Lollipop中我还没有遇到过任何渲染故障,但在KITKAT中我们确实看到了它们(如此问题中所提到的),并且只有当屏幕上存在WebViews时才会出现。
我建议尝试在不同的视图中切换此选项,直到问题被隔离出来(特别是如果容易重现)。
到目前为止,每个此问题的发生都与WebViews相关(或使用WebView的组件,例如AdMob)。根据AOSP问题跟踪器所述,该问题在Android 5.0中已得到解决,但事实并非如此。

@shkschneider 是的,我也希望如此。但是考虑到这个问题已经存在一段时间了,而且没有任何反馈,我不会抱太大希望。我们已经使用这个丑陋的解决方法一段时间了。:( - matiash
1
这是Android L处理Web视图数据渲染的问题。使用webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);可以解决这个问题。 - Surendra Kumar
1
我也遇到了一个问题,就是在ViewPager中显示WebView时出现了问题。通过在WebViews之间进行分页,然后导航离开活动,可以100%重复该问题。奇怪的是,显示损坏从未发生在WebView本身上 - 它发生在完全不同的活动上:当返回到启动器活动时,它会显示在导航列表中的两个步骤后面。自从使用setLayerType为WebView关闭硬件加速以来,我无法复制此问题。 - Lorne Laliberte
@matiash-你好,我尝试了两种方法,但都不起作用。我的布局在“状态栏”和“导航栏”下面。当我动态更新TextView时,屏幕会自动正确显示,但在动态更新之前,我需要保持屏幕的正确性... - Ajit Sharma

2

我见过Lollipop系统的UI出现了一些问题,虽然与你的情况不太一样。但是我找到的唯一解决方法是禁用硬件加速:

android:hardwareAccelerated="false"

在Activity或Application级别上设置硬件加速可能会导致绘制问题。如果这解决了您的问题,请务必向Google报告,因为这可能表明平台存在错误。他们已经有至少一个开放的报告了。
我肯定不希望使用此设置部署应用程序,它只是旨在回答为什么,并帮助证明这不是您代码中的错误。
希望这可以帮到你!
编辑12/10/2014:
@matiash提供了比这个“大锤”建议更精确的答案。我在一个具有ViewPager的多标签应用程序中主要看到ActionBar中的绘图问题,并且总是在没有任何WebView的选项卡/页面上。但是,我的一个选项卡/片段确实嵌入了WebView,当将其设置为软件渲染时,我的问题似乎已经消失了。我完全不介意在发货应用程序中使用@matiash建议的解决方法...尽管它仍然指向平台中的一些潜在问题。

那么你和我一样,认为这是一个平台/框架的 bug? - shkschneider
我有可重复的故障,非常类似于你展示的“ViewPager内部的Google地图碎片”链接。禁用硬件加速可以解决这个问题。我已向谷歌报告了此问题,仍在等待反馈。不确定你的问题是否相同,但很容易尝试一下... - CSmith
禁用硬件加速(虽然这是一种“修复”措施)似乎可以防止该问题,但也会使所有棒棒糖动画(如涟漪)变得非常缓慢,因此有点丑陋... - shkschneider
希望很快能从谷歌那里看到修复!很高兴能够提供帮助。 - CSmith
我知道这会降低我的应用效率,但这是我在这里找到的唯一可行的解决方法。希望Google也能提供一个修复方案。谢谢 - shkschneider

1
我在自己的应用程序中也遇到了这个问题。 有任何 Android 开发者经历过这种视觉静态问题吗?(见图片) 我不仅遇到了这种视觉静态,还出现了重复绘制。只在使用 API 21 和支持库 21.0.+ 开发时,在 Nexus 5 上遇到过这个问题。 对我来说,这个问题不是很容易再现。它会在一个使用会话期间反复发生,但第二天我就无法再现它了。 我没有使用任何 WebView(除了可能通过 admob)。我正在使用带有片段的 ViewPagers。我还使用 DragSortList,并在使用它的活动中首次看到了这个问题。

https://github.com/bauerca/drag-sort-listview

你们这些人觉得这个东西有多容易重现?

0

在渲染后在DecorView上调用请求布局:

getActivity().getWindow().getDecorView().requestLayout();

我在WebViewClient.onPageFinished()中使用postDelay()进行调用。这不是一个完美的解决方案(只是一个权宜之计),但或许存在更好的方式,比如LAYER_TYPE_SOFTWARE。

0

你尝试过在你的Fragment布局中设置android:fitsSystemWindows="true"吗?这将确保布局位于statusBar下方,至于导航按钮,我不是很确定,但我猜这也应该适用。


这真是太奇怪了。它到底是怎么发生的?有没有可能会出现这种情况? - Kosh
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - shkschneider

-1

......前往设置,然后进入开发者选项(如果它们不可见...前往关于手机,然后点击版本号7-10次,开发者模式将打开),然后向下滚动并取消勾选“显示布局边界”,完成。这很简单易行。


问题指的是图形显示在系统UI区域(系统按钮和系统栏)中,而不是布局边界。 - akiraspeirs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接