Intereting Posts
Восстановить представление в исходное состояние xml Как отправить данные из IntentService в класс Non-Activity Скрыть или удалить клавиатуру на экране CardIO Scann (Android) Изображение uri для фотоаппарата Android с возвратом результата Failure ResultInfo Клавиатура перекрывает EditText при нажатии SparseBooleanArray.equals () не работает должным образом Android автозаполняет несколько строк текста в одном результате Android получает значение выбранного переключателя Как разобрать строку «Mon Aug 08 16:44:19 EAT 2016» на сегодняшний день в android Как скрыть, удалить, фильтровать журналы в logcat в Eclipse для Android Отключение Spinner в android Результаты Limit Realm Используя привязку данных Android, как указать текст фиктивного (или «по умолчанию»), который будет отображаться во время предварительного просмотра макета в Android Studio? Может ли Runnable вернуть значение? Дизайн макета Android – Как получить высоту экрана в xml (макеты)

Android: holder.getSurface () всегда возвращает null

Мое мнение – куча обычного виджета и вид на поверхность. Я не знаю, почему после того, как я получу surfaceholder SurfaceView и снова использую getSurface() на держателе, я всегда getSurface() null.

Вот мой пример кода:

 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.view); } @Override public void onResume() { super.onResume(); surface = (SurfaceView) findViewById(R.id.surfaceView); this.holder = surface.getHolder(); if (holder.getSurface().isValid()){ // get surface again Log.i("Notice","Surface holder is valid"); } else Log.i("Notice","Surface holder ISNOT valid"); //Always receive this } 

Когда я вижу документ Android для getSurface() . Вот как это сказано:

Прямой доступ к поверхностному объекту. Поверхность может не всегда быть доступной – например, при использовании SurfaceView поверхность владельца не создается до тех пор, пока представление не будет прикреплено к диспетчеру окон и не выполнит макет, чтобы определить размеры и положение экрана поверхности. Таким образом, вам обычно необходимо реализовать Callback.surfaceCreated, чтобы узнать, доступна ли Surface для использования.

Я этого не понимаю, но знаю, что я что-то упустил. Пожалуйста, объясните мне и расскажите мне о том, как Callback.surfaceCreated и как его реализовать?

Благодаря 🙂

Вы пытаетесь использовать поверхность, когда она еще не доступна. Это хорошо, что он недоступен в методах Activity.onCreate или Activity.onResume потому что фактически поверхность помещается в отдельное окно за окном Activity и имеет собственный жизненный цикл. Вам необходимо реализовать SurfaceHolder.Callback для получения событий о доступности Surface и рисования из отдельного потока. Посмотрите на проект LunarLander в папке с образцами SDK для Android, там показано, как правильно использовать SurfaceView.

Ваш обратный вызов будет выглядеть примерно так:

 public class MyCallback implements SurfaceHolder.Callback { @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override public void surfaceCreated(SurfaceHolder holder) { // you need to start your drawing thread here } @Override public void surfaceDestroyed(SurfaceHolder holder) { // and here you need to stop it } } 

И чем вам нужно установить этот обратный вызов для SurfaceHolder:

 surface.getHolder().addCallback(new MyCallback());