Android: Возвращать фокус с помощью SurfaceView

голоса
5

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

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

Переход назад (который будет запускать onWindowVisibilityChanged) приложение будет врезаться, как он будет пытаться привлечь к поверхности без ее воссоздания.

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

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

Благодаря!

Задан 23/03/2009 в 06:37
источник пользователем
На других языках...                            


2 ответов

голоса
2

Это решение для «mSurfaceExists = TRUE» не работает для меня тоже. Похоже, surfaceCreated () не вызывался, поскольку super.onWindowVisibilityChanged () не вызывается. Таким образом, нет никакой поверхности создается и не врезаться, потому что threas.start не называется.

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

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

Не уверен, если это будет работать. Я буду пытаться это в ближайшее время.

Ответил 04/11/2010 d 21:28
источник пользователем

голоса
1

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 эксперты не стесняйтесь комментировать, если это плохая практика!)

Ответил 23/03/2009 d 07:45
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more