Переключение с полноэкранного на не полноэкранное всплывающее окно/слайд

Переход от неполного экрана к полноэкранному с Android работает нормально. Однако по возвращении из моей полноэкранной активности (полноэкранный видеоплеер) активность всплывает, скользя вниз, когда строка состояния анимируется вниз. Кажется, что возобновляющаяся активность анимируется из полноэкранного режима, но без строки состояния фактическая активность рисуется так, как будто она отсутствует.

Я попытался возиться с моим файлом манифеста, указав темы/стили. Я пытался сделать это программно в onCreate() до того, как будет установлено представление содержимого, и в других местах жизненного цикла активности:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);

Кажется, что невозможно предотвратить анимацию строки состояния вниз и / или из представления содержимого с первого рисунка без строки состояния, а затем настроить ее вниз по мере повторного отображения.

У кого-нибудь есть мысли по этому поводу? Я не уверен, есть ли способ изменить это, и это просто поведение Android.

Заранее спасибо.


person mhradek    schedule 06.10.2011    source источник
comment
как вы решили свою проблему? Не могли бы вы объяснить или дать ссылку?   -  person Pravinsingh Waghela    schedule 28.06.2018
comment
Я использовал принятый ответ Роберта Некича ниже.   -  person mhradek    schedule 02.07.2018


Ответы (8)


Вам нужно еще несколько флагов: FLAG_LAYOUT_IN_SCREEN и FLAG_LAYOUT_NO_LIMITS.

Посетите http://nubinewsblog.blogspot.com/2009/11/smooth-full-screen-transition.html.

person Robert Nekic    schedule 08.11.2011
comment
К сожалению, для решения требуется paddingTop, но оно работает. Спасибо. - person mhradek; 12.11.2011

private void toggleFullscreen(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);
}

Используйте это, это обязательно сработает

person Rahul    schedule 21.08.2014

Ниже приведено мое решение:

Показывать панель состояния системы перед завершением полноэкранного режима.

@Override
public void onBackPressed() {
  getWindow().setFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN, WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);

    mUIHandler.post(new Runnable() {
        @Override
        public void run() {
            MyFullScreenActivity.super.onBackPressed();
        }
    });
}
person user3513329    schedule 25.11.2016
comment
это решение было для меня более полезным, потому что оно не заставляло исходную активность корректировать отступы макета. - person Travis Castillo; 24.10.2017

Наконец-то я нашел идеальный способ справиться с этим случаем, не возясь с отступами.

Вам просто нужно вызвать эту строку в неполноэкранном действии:

getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE);

Таким образом, макет не будет изменен при представлении полноэкранного действия, и вы не увидите всплывающую строку состояния.

person AnthoPak    schedule 09.09.2018
comment
Вместе с fitsSystemWindows это отлично решает мою проблему - person ssynhtn; 17.04.2021

В корневом представлении макета активности добавьте

Android: paddingTop = "25dp"

В onCreate действия перед setContentView() добавить

 getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN);
 getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
person dwbrito    schedule 07.07.2014

Вот идеальный способ устранить эту проблему:

private void setFullscreen(boolean fullscreen) {
    WindowManager.LayoutParams attrs = getWindow().getAttributes();
    if (fullscreen) {
        attrs.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN;
        attrs.flags |= WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
        attrs.flags |= WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS;
    }
    else {
        attrs.flags &= ~WindowManager.LayoutParams.FLAG_FULLSCREEN;
        attrs.flags &= ~WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
        attrs.flags &= ~WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS;
    }
    getWindow().setAttributes(attrs);
}

Вызовите это перед super.onCreate(...) внутри вашей деятельности.

person Ugurcan Yildirim    schedule 16.08.2017

Я смог добиться этого в два этапа.

  1. Используйте Theme.AppCompat.Light.NoActionBar в моих стилях для действия, которое я хочу показать в полноэкранном режиме.

  2. Используйте приведенный ниже код в методе onCreate(Bundle savedInstanceState) Activity WindowManager.LayoutParams attribute = getWindow().getAttributes(); attribute.flags |= WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS; getWindow().setAttributes(атрибуты);

Надеюсь это поможет. Удачного кодирования :)

person Atul O Holic    schedule 14.11.2016

Я не знаю, сработает ли это для вас, но это сработало для меня. Установить полноэкранную активность:

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.my_screen);

отключить полноэкранный режим:

WindowManager.LayoutParams attrs = getWindow().getAttributes();
attrs.flags |= WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS;
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
getWindow().setAttributes(attrs);
startActivity(new Intent(getBaseContext(),NewActivity.class));
finish();
person user3180701    schedule 26.03.2017