键盘发生故障时,某些布局不会绘制

我正在使用一个应用程序,它在SurfaceView根据用户定义的一些参数绘制对象。 我为应用程序创建了布局,其中包括页眉,页脚,输入(用户输入要绘制的参数)和自定义SurfaceView

这是简化的布局:

     ...  ...    

输入布局基于参数生成动态视图。

假设我在输入布局中创建了一个EditText ,以便在与之交互时出现键盘。

这是在键盘出现之前。

键盘显示之前。

这是键盘显示的时间。 请注意,应用程序布局已平移,标题布局不可见。

键盘显示。

键盘宕机时会出现问题。 之前不可见的标题布局始终不可见(直到用户与应用程序交互)。

键盘显示后。

我打开GPU透支来检查问题(也将SurfaceView背景颜色设置为白色),这是结果。

之前:

之前用GPU透支。

后:

用GPU透支后。

此外,这是我的自定义SurfaceView类(我认为自定义SurfaceView阻止UI线程绘制消失的布局)。

 public class CustomPreview extends SurfaceView implements SurfaceHolder.Callback { private final Handler handler = new Handler(); private final Runnable runnable = new Runnable() { @Override public void run() { draw(); } }; private Renderer renderer; private boolean visible; private boolean canLoadData; private HashMap data; public CustomPreview(Context context, AttributeSet attrs) { super(context, attrs); getHolder().addCallback(this); getHolder().setFormat(PixelFormat.RGBA_8888); visible = false; canLoadData = false; renderer= new Renderer(context); data = new HashMap(); } @Override public void surfaceCreated(SurfaceHolder holder) { visible = true; refreshHandler(0); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { renderer.updateDimensions(width, height); canLoadData = true; renderer.updateData(data); refreshHandler(0); } @Override public void surfaceDestroyed(SurfaceHolder holder) { renderer.clearData(); visible = false; canLoadData = false; refreshHandler(0); } public void setVisibility(boolean visible) { this.visible = visible; refreshHandler(0); } private void draw() { Canvas canvas = null; try { canvas = getHolder().lockCanvas(); if (canvas != null) { renderer.draw(canvas); } } finally { if (canvas != null) { getHolder().unlockCanvasAndPost(canvas); } } refreshHandler(60000); } public void saveData(String key, String value) { data.put(key, value); if (canLoadData) { renderer.updateData(data); } refreshHandler(0); } private void refreshHandler(long delay) { handler.removeCallbacks(runnable); if (visible) { if (delay > 0) { handler.postDelayed(runnable, delay); } else { handler.post(runnable); } } } public String loadData(String key) { return data.get(key); } 

难道我做错了什么? 如果是这样,有人可以解释它是什么?

如果有人帮助我,我很高兴。 谢谢。

注意:有关布局的一些额外信息。

  1. 页脚布局最初有一个AdView ,它不包含在布局中。
  2. SYSTEM_UI_FLAG_HIDE_NAVIGATIONSYSTEM_UI_FLAG_FULLSCREEN标志已添加到活动中,因此,填充在各自的布局中设置以避免重叠。
  3. 并且,标题布局有2个工具栏视图,其中一个可以在上面的图像中看到。

在Manifest中尝试以下内容

机器人:windowSoftInputMode = “adjustNothing”