Переключить полноэкранный режим - PullRequest
18 голосов
/ 08 октября 2011

Мне нужна помощь для переключения в полноэкранный режим.У меня есть настройки на экране настроек, чтобы перейти в полноэкранный режим.В моем основном упражнении onResume у меня есть:

if(mFullscreen == true) {
                getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
                getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);

            } else
            {
                getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
                getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);

            }

Но, похоже, это не работает, потому что его нужно вызвать до setContentView верно?

... Но также яиметь requestWindowFeature(Window.FEATURE_NO_TITLE); до setContentView, и это убирает заголовок и строку состояния ... Кто-нибудь может предложить некоторую помощь?

--- Редактировать --- Хорошо, у меня была ошибка, которая вызывала этоне работа.Так оно и есть на самом деле.Теперь мне просто нужно знать, как переключать строку заголовка.

Ответы [ 5 ]

26 голосов
/ 26 апреля 2013
private void setFullscreen(boolean fullscreen)
{
    WindowManager.LayoutParams attrs = getWindow().getAttributes();
    if (fullscreen)
    {
        attrs.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN;
    }
    else
    {
        attrs.flags &= ~WindowManager.LayoutParams.FLAG_FULLSCREEN;
    }
    getWindow().setAttributes(attrs);
}
8 голосов
/ 13 мая 2015
<code>/**
 * toggles fullscreen mode
 * <br/>
 * REQUIRE: android:configChanges="orientation|screenSize"
 * <pre>
 * sample:
 *     private boolean fullscreen;
 *     ................
 *     Activity activity = (Activity)context;
 *     toggleFullscreen(activity, !fullscreen);
 *     fullscreen = !fullscreen;
 * 
* / private void toggleFullscreen (Activity Activity, полноэкранный логический тип) {if (Build.VERSION.SDK_INT> = 11) {// Активированные в настоящее время параметры пользовательского интерфейса представлены битовым полем.// getSystemUiVisibility () дает нам это битовое поле.int uiOptions = activity.getWindow (). getDecorView (). getSystemUiVisibility ();int newUiOptions = uiOptions;boolean isImmersiveModeEnabled = ((uiOptions | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY) == uiOptions);if (isImmersiveModeEnabled) {Log.i (context.getPackageName (), "Отключение режима иммерсивного режима.");} else {Log.i (context.getPackageName (), «Включение режима иммерсивного режима.»);} // Скрытие панели навигации: обратная совместимость с ICS.if (Build.VERSION.SDK_INT> = 14) {newUiOptions ^ = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;} // Скрытие строки состояния: обратная совместимость с Jellybean if (Build.VERSION.SDK_INT> = 16) {newUiOptions ^ = View.SYSTEM_UI_FLAG_FULLSCREEN;} // Режим погружения: обратная совместимость с KitKat.// Обратите внимание, что этот флаг ничего не делает сам по себе, он только увеличивает поведение // HIDE_NAVIGATION и FLAG_FULLSCREEN.Для целей этого примера // все три флага переключаются вместе.// Обратите внимание, что есть два флага пользовательского интерфейса режима погружения, один из которых называется «закрепленный».// Липкий иммерсивный режим отличается тем, что делает навигацию и строки состояния // полупрозрачными, а флаг пользовательского интерфейса не очищается при взаимодействии пользователя с // экраном.if (Build.VERSION.SDK_INT> = 18) {newUiOptions ^ = View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;} activity.getWindow (). getDecorView (). setSystemUiVisibility (newUiOptions);} else {// для android pre 11 WindowManager.LayoutParams attrs = activity.getWindow (). getAttributes ();if (fullscreen) {attrs.flags | = WindowManager.LayoutParams.FLAG_FULLSCREEN;} else {attrs.flags & = ~ WindowManager.LayoutParams.FLAG_FULLSCREEN;} activity.getWindow (). setAttributes (attrs);} try {// скрыть панель действий if (action instanceof ActionBarActivity) {if (fullscreen) ((ActionBarActivity) активность) .getSupportActionBar (). hide ();еще ((ActionBarActivity) действие) .getSupportActionBar (). show ();} else if (Build.VERSION.SDK_INT> = 11) {if (полноэкранный режим) activity.getActionBar (). hide ();else activity.getActionBar (). show ();}} catch (Exception e) {e.printStackTrace ();} // устанавливаем ландшафт // if (полноэкранный режим) activity.setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);// else activity.setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);}

мой код работает нормально с Android 2.3 и 4.4.2

7 голосов
/ 22 января 2014

Начиная с Jellybean (4.1), появился новый метод, который не использует WindowManager. Вместо этого используйте setSystemUiVisibility вне окна, это дает вам более детальный контроль над системными панелями, чем использование флагов WindowManager. Вот как вы включаете полноэкранный режим:

if (Build.VERSION.SDK_INT < 16) { //ye olde method
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                    WindowManager.LayoutParams.FLAG_FULLSCREEN);
} else { // Jellybean and up, new hotness
    View decorView = getWindow().getDecorView();
    // Hide the status bar.
    int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN;
    decorView.setSystemUiVisibility(uiOptions);
    // Remember that you should never show the action bar if the
    // status bar is hidden, so hide that too if necessary.
    ActionBar actionBar = getActionBar();
    actionBar.hide();
}

И вот как вы возвращаете вышеуказанный код:

if (Build.VERSION.SDK_INT < 16) { //ye olde method
    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
} else { // Jellybean and up, new hotness
    View decorView = getWindow().getDecorView();
    // Hide the status bar.
    int uiOptions = View.SYSTEM_UI_FLAG_VISIBLE;
    decorView.setSystemUiVisibility(uiOptions);
    // Remember that you should never show the action bar if the
    // status bar is hidden, so hide that too if necessary.
    ActionBar actionBar = getActionBar();
    actionBar.show();
}
4 голосов
/ 11 мая 2014

Существует более короткая реализация метода переключения в полноэкранном режиме:

private void toggleFullscreen() {
    WindowManager.LayoutParams attrs = getWindow().getAttributes();
    attrs.flags ^= WindowManager.LayoutParams.FLAG_FULLSCREEN;
    getWindow().setAttributes(attrs);
}

Используется побитовая логика XOR для переключения FLAG_FULLSCREEN.

3 голосов
/ 28 сентября 2013

Мое решение объединяет ответы от:

Я добавил эти методы в свою активность. Для переключения на полный экран используйте setFullScreen(!isFullScreen()).

public boolean isFullScreen() {

    return (getWindow().getAttributes().flags & 
        WindowManager.LayoutParams.FLAG_FULLSCREEN) != 0;
}

@SuppressLint("NewApi")
public void setFullScreen(boolean full) {

    if (full == isFullScreen()) {
        return;
    }

    Window window = getWindow();
    if (full) {
        window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
    } else {
        window.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
    }

    if (Build.VERSION.SDK_INT >= 11) {
        if (full) {
            getActionBar().hide();
        } else {
            getActionBar().show();
        }
    }
}

В моем случае я хотел, чтобы кнопка меню выполняла переключение. Проблема: на устройстве без аппаратной кнопки меню, скрытие панели действий также скрывает переключение для возврата из полноэкранного режима. Итак, я добавил некоторую дополнительную логику, чтобы она скрывала панель действий только в том случае, если на устройстве есть кнопка аппаратного меню. Обратите внимание, что на устройствах с SDK 11-13 такого не было.

    if (Build.VERSION.SDK_INT >= 14 
        && ViewConfiguration.get(this).hasPermanentMenuKey()))) {

        if (full) {
            getActionBar().hide();
        } else {
            getActionBar().show();
        }
    }

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

    // call before setContentView()
    if (Build.VERSION.SDK_INT < 11) {
        requestWindowFeature(Window.FEATURE_NO_TITLE);
    }
...