Android 활동에서 탐색 모음을 영구적으로 숨기는 방법은 무엇입니까?


80

내 활동에서 내비게이션 바를 영구적으로 숨기고 싶습니다 (전체 시스템 UI가 아님). 이제이 코드를 사용하고 있습니다.

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

막대를 숨기지 만 사용자가 화면을 터치하면 다시 표시됩니다. 활동할 때까지 영구적으로 숨길 수있는 방법이 있습니까 onStop()?



이 공식 Google / Android 링크 : 전체 화면 모드 사용 에서 훌륭하고 구체적인 세부 정보가 많이 나와 있습니다 .
Chris Sprague

문서에 따라 사용자가 화면을 터치하면 플래그가 자동으로 지워집니다. 항상 탐색 모음을 숨기려면 UI 디자인을 변경해야합니다.
user1154390

답변:


118

짧은 발췌:

FullScreenFragment.java

HideNavigationBarComponent.java


Android 4.4 이상용입니다.

몰입 형 모드 https://developer.android.com/training/system-ui/immersive.html 사용해보기

빠른 스 니펫 ( 활동 클래스 용) :

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);
    }
}

볼륨 크게 또는 볼륨 작게를 누를 때 문제가있는 경우 탐색 모음에 표시됩니다. 나는에 코드를 추가 onCreate참조 setOnSystemUiVisibilityChangeListener

다음은 또 다른 관련 질문입니다.

몰입 형 모드 탐색은 볼륨을 누르거나 복원을 최소화 한 후 고정됩니다.


4
사용자가 화면의 상단 / 하단을 스 와이프하면 반투명 내비게이션 바가 일시적으로 표시되었다가 다시 숨겨집니다. 그것도 숨길 수 있습니까?
Finder

@KarthickRamu 나는 :) 내 대답은 아래로보고, 방법을 발견
모하메드 Refaat에게

1
@MuhammedRefaat 힌트에는 루팅 된 장치가 필요합니다. :(
Finder

1
@DawidDrozd 감사합니다.하지만 문제가 있습니다. 내 활동 루트 레이아웃이 RelativeLayout이고 android : layout_alignParentBottom = "true"로 설정된 자식보기가 있습니다. 탐색 모음이 사라지지만 자식보기가 아래쪽 가장자리로 이동하지 않습니다. 화면의 내비게이션 바가 보이지 않게 설정되어있는 것처럼 사라지지 않는 경우 도움이 될 수 있습니까?
Jack

1
탐색 모음이 차지하는 공간을 활용하려면 android:fitsSystemWindows="true"보기에서 모든 항목을 제거 해야합니다. Android Studio는 일부 레이아웃을 생성 할 때이 속성을 포함합니다. stackoverflow.com/a/42501330/650894
Joe Lapp

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);

몰입 형 모드라고합니다. 다른 가능성에 대해서는 공식 문서를 볼 수 있습니다.


나는 err (기호 View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY를 찾을 수 없음);)```@Override protected void onStart () {getWindow (). getDecorView (). setSystemUiVisibility (View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onStart (); }```
Bilal Yaqoob

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를보기로 설정합니다. 나는 Surfaceview를 사용하므로 다음과 같습니다.

    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 세 이상 필요
zackygaurav

1

다른 답변은 대부분의 setSystemUiVisibility()메서드에 플래그를 사용합니다 View. 그러나이 API는 Android 11부터 더 이상 사용되지 않습니다 . 자세한 내용은 시스템 UI 가시성 수정에 대한 내 기사를 확인하십시오. 이 기사에서는 컷 아웃을 올바르게 처리하는 방법이나 가시성 변경을 듣는 방법도 설명합니다.

다음은 이전 버전과의 호환성을 위해 더 이상 사용되지 않는 API뿐만 아니라 새 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 플래그를 사용하여 코드를 시도했지만 화면을 터치하면 탐색 표시 줄이 표시되고 계속 표시됩니다. Android 11에서 STICKY 기능을 사용하려면 무엇을 설정해야하는지 아십니까?
Angel Koh

@AngelKoh 숨기려면 수동으로 hideSystemUI ()를 호출해야합니다. 내 대답에 언급 된 기사를 확인하십시오.이 모든 세부 정보가 포함되어 있습니다. 고정 모드는 사용자가 바를 위로 스 와이프하면 바가 투명 해지며 앱에서 터치 이벤트도 수신합니다 ( developer.android.com/training/system-ui/… 참조 ).
Miloš Černilovský

예 hideSystemUI ()가 호출되고 Ui가 처음 숨겨졌습니다. 그러나 나중에 화면을 터치하면 내비게이션 바가 다시 튀어 나와 계속 표시됩니다.
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);

NO 그것은 나에게 같은 결과를 제공 없습니다
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에서 작동합니다. 도움이 되길 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.