Android: Recuperando foco usando SurfaceView
-
21-08-2019 - |
Pergunta
Atualmente estou chegar ao confronto com Android, brincar com a amostra Lunar Lander.
Descobri que se você sair do aplicativo (por exemplo, apertar o botão de chamada) que vai destruir o (surfaceDestroyed
chamando) superfície subjacente.
Navegação de volta (o que irá desencadear onWindowVisibilityChanged
) o aplicativo irá falhar, uma vez que irá tentar atrair para a superfície sem recriá-lo.
Existe algum código que pode colocar em onWindowVisibilityChanged
(ou em qualquer outro lugar) que vai gerar a execução de superfície e currículo subjacente do SurfaceView bem?
Parece que esta deve ser uma chamada de função simples, mas eu não consigo encontrar nada na documentação da API.
Obrigado!
Solução 2
Mis-diagnóstico! O aplicativo recria a superfície automaticamente, mas há uma chamada lá dentro que tenta desenhar a ele antes de ser criado.
Corrigir o problema:
boolean mSurfaceExists;
...
public void surfaceDestroyed(SurfaceHolder holder) {
mSurfaceExists = false;
...
}
public void surfaceCreated(SurfaceHolder holder) {
mSurfaceExists = true;
...
}
protected void onWindowVisibilityChanged(int visibility) {
// only call base if there's a surface
if(mSurfaceExists)
super.onWindowVisibilityChanged(visibility);
}
Agora é tudo swell. (Tanto quanto eu estou ciente, de qualquer maneira - Java / peritos Android à vontade para comentar se esta é uma prática ruim)
Outras dicas
Esta solução para "mSurfaceExists = true" não está funcionando para mim. Parece que surfaceCreated () não está sendo chamado porque super.onWindowVisibilityChanged () não é chamado. Portanto, não há superfície criada e não falhar porque threas.start não é chamado.
Eu acredito que o problema é: Chamando Thread.Start () faz com que o erro porque o segmento já foi iniciado. Mas, em surfaceDestroyed (), Thread.Join faz com que o thread para completa e morrer. E um segmento não pode ser reiniciado uma vez morto.
Eu estou supondo que o truque é criar um novo tópico no surfacecreated ou única causa a linha para completar quando o usuário está chamando o aplicativo para acabamento (chave de volta) e não parando (chave de casa). Isto pode ser verificado chamando isFinishing () sobre a atividade.
Não tenho certeza se isso vai funcionar. Vou tentar ser tão cedo.