С самого начала Android, вся система была в верхней части строки состояния. В Android Honeycomb строка состояния была перемещена в нижнюю часть экрана. Такие приложения, как игры или средства просмотра изображений, требуют полного внимания пользователя, и большинство из них используют весь экран для отображения. Например, в приложении Галерея по умолчанию, когда вы нажимаете на изображение, оно отображается в полноэкранном режиме без чего-либо еще.
Первоначально Автор Карлос Сесса
Представьте, что вам нужно предоставить эту функцию в вашем приложении, и она должна быть совместима с любой версией Android. В этом разделе мы создадим простое приложение, которое будет иметь красный фон, и, когда мы его нажмем, приложение перейдет в режим отключения. Сначала мы позаботимся об Android 2.x и 3.x по отдельности, но потом мы объединим их в одну реализацию.
60 Android-хаков
Карлос Сесса
Большинство игр или просмотрщиков изображений отображают весь экран. В этой статье, основанной на методике, представленной в 60 Android Hacks , автор показывает, как создать простое приложение, которое переходит в режим отключения при нажатии на фон. Лучше всего то, что он совместим между Android 2.x и 3.x.
Android 2.x
Сначала мы позаботимся о коде Android 2.x. В Android 2.x у нас есть концепция полноэкранного режима. Идея, стоящая за полноэкранным режимом, заключается в том, чтобы окно приложения могло использовать все пространство дисплея.
Нас также интересует другая концепция: название приложения. Название приложения — это серая полоса, которую мы видим в верхней части экрана. Вот код для создания эффекта:
Перечисление 1, Удаляющее название приложения в Android 2.x
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); #1 setContentView(R.layout.main); mContentView = findViewById(R.id.content); mContentView.setOnClickListener(new OnClickListener() { #2 @Override public void onClick(View v) { Window w = getWindow(); if(mUseFullscreen) { #3 w.addFlags( WindowManager.LayoutParams.FLAG_FULLSCREEN); w.clearFlags( WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); } else { w.addFlags( WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); w.clearFlags( WindowManager.LayoutParams.FLAG_FULLSCREEN); } mUseFullscreen = !mUseFullscreen; } }); }
Код не требует пояснений. В # 1 мы просим удалить строку заголовка. Это необходимо сделать до вызова setContentView (), и, к сожалению, это невозможно сделать динамически. В # 2 мы делаем общий вызов setContentView () и просим ссылку на корневой элемент нашего представления. Этот элемент будет работать как выключатель для полноэкранного режима.
В последней части кода указано, как должен работать полноэкранный режим. В # 3 вы можете увидеть, как переменная поля используется для переключения статуса.
Android 3.x
В Android 3.x концепции, объясненные для Android 2.x, немного различаются. Строка заголовка в конечном итоге представляет собой панель действий в верхней части экрана, а строка состояния — в нижней части экрана.
Важным изменением в Android 3.x является отсутствие физических кнопок; они все размещены в строке состояния. Из-за этого строка состояния не может быть отклонена, но она может быть затемнена. Вот код:
Перечисление 2, Затемняющее строку состояния в Android 3.x
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mContentView = findViewById(R.id.content); #1 mContentView.setOnSystemUiVisibilityChangeListener( #2 new OnSystemUiVisibilityChangeListener() { public void onSystemUiVisibilityChange(int visibility) { ActionBar actionBar = getActionBar(); if (actionBar != null) { mContentView.setSystemUiVisibility(visibility); if (visibility == View.STATUS_BAR_VISIBLE) { #3 actionBar.show(); } else { actionBar.hide(); } } } }); mContentView.setOnClickListener(new OnClickListener() { #4 public void onClick(View v) { if (mContentView.getSystemUiVisibility() == View.STATUS_BAR_VISIBLE) { mContentView.setSystemUiVisibility( View.STATUS_BAR_HIDDEN); } else { mContentView.setSystemUiVisibility( View.STATUS_BAR_VISIBLE); } } }); }
Аналогично тому, что мы делали раньше, мы получаем ссылку на корневой элемент нашего представления в # 1. В Honeycomb представления имеют новый метод setOnSystemUiVisibilityChangeListener (). Это было создано, чтобы иметь место для получения обратных вызовов при изменении видимости системной панели. В # 2 я использовал этот метод, чтобы скрыть или показать панель действий в зависимости от параметра видимости, как вы можете видеть в # 3. В # 4 мы установили прослушиватель щелчков в корневом представлении, где мы переключаем видимость системного интерфейса, что в основном означает включение и выключение режима отключения.
Объединение обоих миров в одном действии
Мы показали, как работать с обоими сценариями в разных версиях Android, но было бы неплохо, если бы они были кросс-совместимы. Мы можем создать Activity, которая обрабатывает оба случая, но нам нужно сделать это с помощью оператора if, который проверяет версию Android.
Перечисление 3, Проверяющее версию Android
if ( Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB ) { #1 configure3x(); } else { configure2x(); }
Для создания оператора if я использовал класс Build. Как видно из # 1, класс Build также имеет внутренний класс VERSION_CODES, который можно использовать для проверки версии, на которой работает устройство.
Резюме
Вы обнаружите, что все, что я сделал здесь, может быть сделано с использованием стилей. Это нормально, если вы не хотите динамически поддерживать эту функцию. Вы должны знать, что скрытие строки состояния запретит пользователю просматривать уведомления и может привести к тому, что пользователь закроет ваше приложение, чтобы посмотреть, что происходит. С другой стороны, использование режима отключения света в Android — это крутой способ погрузить пользователя в работу вашего приложения.
Вот некоторые другие названия Мэннинга, которые могут вас заинтересовать:
Android в действии, третье издание
У. Фрэнк Эблсон, Роби Сен, Крис Кинг и К. Энрике Ортис Android на практике Чарли Коллинз, Майкл Д. Галпин и Матиас Кепплер Основы Objective-C Кристофер К. Фэрбэрн, Йоханнес Фаренкруг и Коллин Ruffenach