这是一个奇怪的问题,我花了很长时间才能可靠地重现。
我有一个非常简单的菜单活动;只是在xml中定义的一些按钮。
我有一个带有GLSurfaceView布局的活动和一些在xml中定义的按钮。 这些按钮定义了onClick属性。可以从菜单活动访问此活动。
在OpenGL活动中,有相关的onClick函数“onFoo(View view)”。
当我使用本机后退按钮导航回菜单活动时,没有任何有趣的事情发生;但是,当我点击带有onClick属性的任何xml定义按钮然后导航回来时,菜单上的一些ImageViews活动显示为黑色,但在其正确的位置,大小等处。他们的xml定义onClick函数也能正常工作。
我正在重新导出菜单活动中的所有图像(以消除任何导出设置缺陷,因为资产最初是在不同时间导出的),但是当我等待这种情况发生时,我想也许有人在那里有之前遇到过这个问题。
为了限制此问题中的变量,我甚至在OpenGL活动中注释掉了函数的内容,以确保onClick函数中没有任何内容导致冲突。
e.g。
public void onMainMenu(查看视图) { }
因此,澄清一下,如果我点击xml中使用onClick属性定义的按钮,例如 android:onClick =“onMainMenu”使用上面的空方法,然后按本机后退按钮发生问题,但不跳过点击onMainMenu按钮时。
我不能确定它是否总是变成黑色的同一组ImageViews,但是一个ImageView确实似乎始终存在正确的Drawable;这很奇怪,因为ImageViews的定义与src属性不同。它们的大小都相对相同,而且根本不大。
我原本以为它与EGL上下文有关(Android displays black rectangles instead of drawable images after opening openGL context)(可能仍然如此),但后来我发现如何通过按下按钮来100%重现它向后导航之前的onClick属性。内存使用情况处于控制状态,我可能会遇到可能的解决方案或追踪到一个。
我可以在我拥有的三种设备上重现这一点:HTC One,Droid Bionic,Galaxy Tab 2 7。
应用程序是minSdk:14,目标:17。硬件加速已开启。
我尝试使用以下结果播放硬件加速设置:
如果我关闭应用程序的硬件加速,并将其添加到OpenGl活动,则不会出现主菜单问题,但OpenGL活动中会出现同样的问题。在此活动的情况下,一些ImageView的可绘制资源在运行时被切换出来。切换后的资源显示正确,但当切换回与xml中为该ImageView定义的资源相同时,它呈现黑色。
澄清切换:在一个这样的情况下,我有一个用于背景的可绘制状态选择器的视图。在两种状态之间切换时(它们的功能类似于选项卡,即xml中定义的默认状态相反),默认状态始终显示为黑色,但辅助状态显示正确。
如果我关闭应用程序和OpenGL活动的硬件加速,问题就会完全消失。
我担心使用它作为解决方案,因为我不能确定在我不需要测试的设备上可能出现的任何性能问题。
从OpenGL活动中删除硬件加速会破坏至少在Droid Bionic上覆盖GLSurfaceView的视图,所以我宁愿不使用这种伪解决方案。
这是我第一次在Stack Overflow上发布一个问题。我总是找到一个坚实的领导搜索,但在这种情况下找不到解决方案甚至是类似情况的问题。
感谢社区提供的任何帮助和智慧!
答案 0 :(得分:1)
问题归结为对GLES20.glDeleteTextures(int size,int [] textureNames,int offset)的调用。我在onPause()期间调用了这个,这在某种程度上导致了冲突。我不确定它是如何与触摸GLSurfaceView之外的UI项目相关的。删除一个呼叫会以某种方式阻止此问题。