Як назавжди приховати панель навігації в діяльності Android?


80

Я хочу назавжди приховати панель навігації у своїй діяльності (а не в цілому системному інтерфейсі). тепер я використовую цей шматок коду

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

Він приховує панель, але коли користувач торкається екрана, він знову відображається. чи є спосіб приховати його назавжди до активності onStop();



Багато хороших і конкретних деталей викладено тут, за цим офіційним посиланням Google / Android: Увімкнути повноекранний режим .
Кріс Спраг,

Прапор автоматично знімається, коли користувач торкається екрана відповідно до документації. Вам потрібно внести зміни в дизайн інтерфейсу, щоб постійно приховувати панель навігації.
user1154390

Відповіді:


118

Фрагменти:

FullScreenFragment.java

HideNavigationBarComponent.java


Це для Android 4.4+

Спробуйте іммерсивний режим https://developer.android.com/training/system-ui/immersive.html

Швидкий фрагмент (для класу Activity ):

private int currentApiVersion;

@Override
@SuppressLint("NewApi")
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);

    currentApiVersion = android.os.Build.VERSION.SDK_INT;

    final int flags = View.SYSTEM_UI_FLAG_LAYOUT_STABLE
        | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
        | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
        | View.SYSTEM_UI_FLAG_FULLSCREEN
        | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;

    // This work only for android 4.4+
    if(currentApiVersion >= Build.VERSION_CODES.KITKAT)
    {

        getWindow().getDecorView().setSystemUiVisibility(flags);

        // Code below is to handle presses of Volume up or Volume down.
        // Without this, after pressing volume buttons, the navigation bar will
        // show up and won't hide
        final View decorView = getWindow().getDecorView();
        decorView
            .setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener()
            {

                @Override
                public void onSystemUiVisibilityChange(int visibility)
                {
                    if((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0)
                    {
                        decorView.setSystemUiVisibility(flags);
                    }
                }
            });
    }

}


@SuppressLint("NewApi")
@Override
public void onWindowFocusChanged(boolean hasFocus)
{
    super.onWindowFocusChanged(hasFocus);
    if(currentApiVersion >= Build.VERSION_CODES.KITKAT && hasFocus)
    {
        getWindow().getDecorView().setSystemUiVisibility(
            View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_FULLSCREEN
                | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
    }
}

Якщо під час натискання кнопки збільшення або зменшення гучності виникають проблеми, які відображається на панелі навігації. Я додав код у onCreatesee setOnSystemUiVisibilityChangeListener

Ось ще одне пов'язане питання:

Навігаційний режим навігації стає липким після натискання гучності або мінімізації-відновлення


4
Коли користувач проводить пальцем по верхній / нижній частині екрана, на екрані тимчасово з’являються напівпрозорі навігаційні панелі, а потім знову приховуються. ЧИ МОЖЛИВО ТАКОЖ ПРИХОТИТИ?
Finder

@KarthickRamu Я знайшов спосіб, просто подивись на мою відповідь вниз :)
Мухаммед Рефаат

1
@MuhammedRefaat Вашій підказці потрібен кореневий пристрій :(
Finder

1
@DawidDrozd Дякую, але у мене проблема, кореневий макет моєї активності - RelativeLayout, і він має дочірній вигляд, який встановлений на android: layout_alignParentBottom = "true", панель навігації зникає, але дочірній вигляд не переміщується до нижнього краю екрану, ніби панель навігації встановлена ​​на невидиму, а не зникла, чи можете ви допомогти?
Джек

1
Якщо ви хочете використати простір, який зайняла панель навігації, вам доведеться видалити всі випадки android:fitsSystemWindows="true"з ваших видів. Android Studio включає цей атрибут під час створення деяких макетів. Дивіться stackoverflow.com/a/42501330/650894
Джо Лапп,

65

Зробити це.

public void FullScreencall() {
    if(Build.VERSION.SDK_INT > 11 && Build.VERSION.SDK_INT < 19) { // lower api
        View v = this.getWindow().getDecorView();
        v.setSystemUiVisibility(View.GONE);
    } else if(Build.VERSION.SDK_INT >= 19) {
        //for new api versions.
        View decorView = getWindow().getDecorView();
        int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
        decorView.setSystemUiVisibility(uiOptions);
    }
}

Це працює на 100%, і ви можете зробити те ж саме для нижчих версій API, навіть якщо це пізня відповідь, сподіваюся, це допоможе комусь іншому.

Якщо ви хочете, щоб це було постійно, просто зателефонуйте FullscreenCall()всередину вашого onResume()методу.


2
Я рекомендую поглянути на developer.android.com/training/system-ui/immersive.html , де пояснюється, що ваш метод просто приховує панель, доки не відбудеться взаємодія, і знову незабаром після завершення взаємодії.
Покинутий кошик

Щиро дякую - це вдалося! : D: +1
Крістофер Сток

7

Для людей, які шукають більш просте рішення, я думаю, ви можете просто ввести цей один рядок коду onStart()

  getWindow().getDecorView().setSystemUiVisibility(
            View.SYSTEM_UI_FLAG_HIDE_NAVIGATION|
            View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);

Це називається режим занурення. Інші можливості можна переглянути в офіційній документації.


Я отримую помилку (не вдається знайти символ View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);) `` `@Override protected void onStart () {getWindow (). GetDecorView (). super.onStart (); } ``
Білал Якуб,

4

За даними сайту розробника Android

Я думаю, ви не можете (наскільки мені відомо) назавжди сховати панель навігації ..

Однак ви можете зробити один трюк. Це трюк, пам’ятайте.

Якраз коли navigation barз’являється, коли користувач торкається екрана. Негайно сховайте це знову. Це весело.

Перевірте це .

void setNavVisibility(boolean visible) {
int newVis = SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
        | SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
        | SYSTEM_UI_FLAG_LAYOUT_STABLE;
if (!visible) {
    newVis |= SYSTEM_UI_FLAG_LOW_PROFILE | SYSTEM_UI_FLAG_FULLSCREEN
            | SYSTEM_UI_FLAG_HIDE_NAVIGATION;
}

// If we are now visible, schedule a timer for us to go invisible.
if (visible) {
    Handler h = getHandler();
    if (h != null) {
        h.removeCallbacks(mNavHider);
        if (!mMenusOpen && !mPaused) {
            // If the menus are open or play is paused, we will not auto-hide.
            h.postDelayed(mNavHider, 1500);
        }
    }
}

// Set the new desired visibility.
setSystemUiVisibility(newVis);
mTitleView.setVisibility(visible ? VISIBLE : INVISIBLE);
mPlayButton.setVisibility(visible ? VISIBLE : INVISIBLE);
mSeekView.setVisibility(visible ? VISIBLE : INVISIBLE);
}

Дивіться це для отримання додаткової інформації про це ..

Сховати системну панель у планшетах


3

Використання: -

view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);

У планшетах під управлінням Android 4+ неможливо приховати панель системи / навігації.

З документації :

SYSTEM_UI_FLAG_HIDE_NAVIGATION - це новий прапор, який вимагає повністю приховати панель навігації. Майте на увазі, що це працює лише для панелі навігації, що використовується деякими слухавками (вона не приховує системну панель на планшетах).


2

Це моє рішення:

Спочатку визначте логічне значення, яке вказує, видно панель навігації чи ні.

boolean navigationBarVisibility = true //because it's visible when activity is created

Другий метод створення, який приховує панель навігації.

private void setNavigationBarVisibility(boolean visibility){
    if(visibility){
        View decorView = getWindow().getDecorView();
        int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_FULLSCREEN;
        decorView.setSystemUiVisibility(uiOptions);
        navigationBarVisibility = false;
    }

    else
        navigationBarVisibility = true;
}

За замовчуванням, якщо натиснути кнопку активності після приховування навігаційної панелі, панель навігації буде видно. Отже, ми отримали його стан, якщо це видно, ми його приховаємо.

Тепер встановіть OnClickListener на ваш погляд. Я використовую поверхневий перегляд, тому для мене:

    playerSurface.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            setNavigationBarVisibility(navigationBarVisibility);
        }
    });

Крім того, ми повинні викликати цей метод при запуску активності. Тому що ми хочемо приховати це на самому початку.

        setNavigationBarVisibility(navigationBarVisibility);

2

Це проблема безпеки: https://stackoverflow.com/a/12605313/1303691

тому неможливо приховати навігацію на планшеті назавжди одним одним дзвінком на початку створення подання. Він буде прихований, але з’явиться під час торкання екрана. Отже, лише другий дотик до вашого екрану може спричинити onClickEvent на вашому макеті. Тому вам потрібно перехопити цей дзвінок, але мені це ще не вдалося, я оновлю свою відповідь, коли дізнався. Або ви вже зараз відповідь?


1

Я думаю, що ударний код допоможе вам, і додайте цей код перед setContentView ()

getWindow().setFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS, WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);

Додайте код позаду setContentView () getWindow (). GetDecorView (). SetSystemUiVisibility (View.SYSTEM_UI_FLAG_LOW_PROFILE);


1
Поле вимагає рівень API
21+

1

В інших відповідях здебільшого використовуються прапори для setSystemUiVisibility()методу в View. Однак цей API застарілий з Android 11. Перегляньте мою статтю про зміну видимості системного інтерфейсу для отримання додаткової інформації. У статті також пояснюється, як правильно обробляти вирізи або як прослуховувати зміни видимості.

Ось фрагменти коду для показу / приховування системних рядків з новим API, а також застарілий для зворотної сумісності:

/**
 * Hides the system bars and makes the Activity "fullscreen". If this should be the default
 * state it should be called from [Activity.onWindowFocusChanged] if hasFocus is true.
 * It is also recommended to take care of cutout areas. The default behavior is that the app shows
 * in the cutout area in portrait mode if not in fullscreen mode. This can cause "jumping" if the
 * user swipes a system bar to show it. It is recommended to set [WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER],
 * call [showBelowCutout] from [Activity.onCreate]
 * (see [Android Developers article about cutouts](https://developer.android.com/guide/topics/display-cutout#never_render_content_in_the_display_cutout_area)).
 * @see showSystemUI
 * @see addSystemUIVisibilityListener
 */
fun Activity.hideSystemUI() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
        window.insetsController?.let {
            // Default behavior is that if navigation bar is hidden, the system will "steal" touches
            // and show it again upon user's touch. We just want the user to be able to show the
            // navigation bar by swipe, touches are handled by custom code -> change system bar behavior.
            // Alternative to deprecated SYSTEM_UI_FLAG_IMMERSIVE.
            it.systemBarsBehavior = WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
            // make navigation bar translucent (alternative to deprecated
            // WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION)
            // - do this already in hideSystemUI() so that the bar
            // is translucent if user swipes it up
            window.navigationBarColor = getColor(R.color.internal_black_semitransparent_light)
            // Finally, hide the system bars, alternative to View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
            // and SYSTEM_UI_FLAG_FULLSCREEN.
            it.hide(WindowInsets.Type.systemBars())
        }
    } else {
        // Enables regular immersive mode.
        // For "lean back" mode, remove SYSTEM_UI_FLAG_IMMERSIVE.
        // Or for "sticky immersive," replace it with SYSTEM_UI_FLAG_IMMERSIVE_STICKY
        @Suppress("DEPRECATION")
        window.decorView.systemUiVisibility = (
                // Do not let system steal touches for showing the navigation bar
                View.SYSTEM_UI_FLAG_IMMERSIVE
                        // Hide the nav bar and status bar
                        or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                        or View.SYSTEM_UI_FLAG_FULLSCREEN
                        // Keep the app content behind the bars even if user swipes them up
                        or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                        or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN)
        // make navbar translucent - do this already in hideSystemUI() so that the bar
        // is translucent if user swipes it up
        @Suppress("DEPRECATION")
        window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION)
    }
}

/**
 * Shows the system bars and returns back from fullscreen.
 * @see hideSystemUI
 * @see addSystemUIVisibilityListener
 */
fun Activity.showSystemUI() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
        // show app content in fullscreen, i. e. behind the bars when they are shown (alternative to
        // deprecated View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION and View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN)
        window.setDecorFitsSystemWindows(false)
        // finally, show the system bars
        window.insetsController?.show(WindowInsets.Type.systemBars())
    } else {
        // Shows the system bars by removing all the flags
        // except for the ones that make the content appear under the system bars.
        @Suppress("DEPRECATION")
        window.decorView.systemUiVisibility = (
                View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                        or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN)
    }
}

Я спробував ваші коди за допомогою прапора BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE на емуляторі, але панель навігації з’явиться і залишиться відображеною, коли я торкнуся екрана. Будь-яка ідея, що ще я повинен встановити, щоб отримати функцію STICKY на Android 11?
Angel Koh

@AngelKoh Вам потрібно викликати hideSystemUI (), якщо ви хочете його приховати. Перевірте статтю, згадану в моїй відповіді, вона містить усі ці деталі. Липкий режим означає, що смуги будуть прозорими, якщо користувач проведе їх пальцем угору, а додаток також отримає події дотику (див. Developer.android.com/training/system-ui/… ).
Miloš Černilovský

так, викликається hideSystemUI (), і користувацький інтерфейс прихований вперше. однак, коли я торкаюся екрана потім, панель навігації вискакує назад і залишається відображеною.
Angel Koh

Метою BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE є запобігання крадіжці системи та відображення стовпчиків. Тому я не впевнений, що може спричинити це, не побачивши / не налагодивши реальний додаток.
Miloš Černilovský

0

Спробуйте це:

View decorView = getWindow().getDecorView();
int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
          | View.SYSTEM_UI_FLAG_FULLSCREEN;
decorView.setSystemUiVisibility(uiOptions);

НІ, це дасть мені той самий результат
Sujith Manjavana

0

Я думаю, що цей код вирішить вашу проблему. Скопіюйте та вставте цей код на MainActivity.java

@Override
protected void onCreate(Bundle savedInstanceState) {                          
    super.onCreate(savedInstanceState);

    View decorView = getWindow().getDecorView();
    decorView.setOnSystemUiVisibilityChangeListener
    (new View.OnSystemUiVisibilityChangeListener() {
        @Override
        public void onSystemUiVisibilityChange(int visibility) {

            if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) {
                hideNavigationBar();
            } 
        }
    });
}



private void hideNavigationBar() {
   getWindow().getDecorView().setSystemUiVisibility(
        View.SYSTEM_UI_FLAG_HIDE_NAVIGATION|
        View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
}

Це буде працювати на Android-10. Сподіваюся, це допоможе.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.