Android: восстановление фокуса с помощью SurfaceView - PullRequest
5 голосов
/ 23 марта 2009

В настоящее время я вхожу в борьбу с Android, играя с образцом Lunar Lander.

Я обнаружил, что если вы уйдете из приложения (например, нажмете кнопку вызова), оно разрушит основную поверхность (вызов surfaceDestroyed).

Навигация в обратном направлении (которая вызовет onWindowVisibilityChanged) приведет к сбою приложения, так как оно попытается нарисовать поверхность, не создавая ее заново.

Есть ли какой-нибудь код, который я могу вставить в onWindowVisibilityChanged (или где-либо еще), который восстановит базовую поверхность SurfaceView и возобновит выполнение?

Такое чувство, что это должен быть простой вызов функции, но я ничего не могу найти в документации API.

Спасибо!

Ответы [ 2 ]

2 голосов
/ 04 ноября 2010

Это решение для "mSurfaceExists = true" также не работает для меня. Похоже, SurfaceCreated () не вызывается, потому что super.onWindowVisibilityChanged () не вызывается. Таким образом, поверхность не создается, и она не падает, потому что не вызывается файл treas.start.

Я считаю, что проблема заключается в: Вызов thread.start () вызывает ошибку, поскольку поток уже запущен. Но в surfaceDestroyed () thread.join заставляет поток завершиться и умереть. И поток не может быть перезапущен после смерти.

Я предполагаю, что хитрость заключается в том, чтобы создать новый поток в SurfaceCreated или заставить поток завершиться только тогда, когда пользователь вызывает приложение для завершения (клавиша возврата) и не делает паузу (домашний ключ). Это можно проверить, вызвав isFinishing () для действия.

Не уверен, что это сработает. Я скоро попробую.

1 голос
/ 23 марта 2009

Mis-диагностика! Приложение автоматически создает поверхность заново, но там есть вызов, который пытается нарисовать ее до того, как она будет создана.

Исправление проблемы:

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);
}

Теперь все хорошо. (насколько я знаю, в любом случае - эксперты Java / Android могут свободно комментировать, если это плохая практика!)

...