내 활동에서 내비게이션 바를 영구적으로 숨기고 싶습니다 (전체 시스템 UI가 아님). 이제이 코드를 사용하고 있습니다.
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
막대를 숨기지 만 사용자가 화면을 터치하면 다시 표시됩니다. 활동할 때까지 영구적으로 숨길 수있는 방법이 있습니까 onStop()
?
내 활동에서 내비게이션 바를 영구적으로 숨기고 싶습니다 (전체 시스템 UI가 아님). 이제이 코드를 사용하고 있습니다.
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
막대를 숨기지 만 사용자가 화면을 터치하면 다시 표시됩니다. 활동할 때까지 영구적으로 숨길 수있는 방법이 있습니까 onStop()
?
답변:
짧은 발췌:
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
다음은 또 다른 관련 질문입니다.
android:fitsSystemWindows="true"
보기에서 모든 항목을 제거 해야합니다. Android Studio는 일부 레이아웃을 생성 할 때이 속성을 포함합니다. stackoverflow.com/a/42501330/650894
이 작업을 수행.
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()
.
더 간단한 솔루션을 찾는 사람들을 위해이 코드 한 줄을
onStart()
getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION|
View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
몰입 형 모드라고합니다. 다른 가능성에 대해서는 공식 문서를 볼 수 있습니다.
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);
}
이에 대한 자세한 내용은이 ..
내 솔루션입니다.
먼저 탐색 모음이 표시되는지 여부를 나타내는 부울을 정의합니다.
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);
보안 문제 : https://stackoverflow.com/a/12605313/1303691
따라서보기 생성 초기에 한 번의 호출로 태블릿에서 내비게이션을 영구적으로 숨길 수 없습니다. 숨겨 지지만 화면을 터치하면 팝업됩니다. 따라서 화면을 두 번째 터치하면 레이아웃에 onClickEvent가 발생할 수 있습니다. 따라서이 전화를 가로 챌 필요가 있지만 아직 처리하지 않았기 때문에 답을 찾으면 업데이트하겠습니다. 아니면 이제 이미 답이 되었습니까?
타격 코드가 도움이 될 것이라고 생각하며 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);
다른 답변은 대부분의 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)
}
}
이 시도:
View decorView = getWindow().getDecorView();
int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN;
decorView.setSystemUiVisibility(uiOptions);
이 코드가 문제를 해결할 것이라고 생각합니다. 이 코드를 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에서 작동합니다. 도움이 되길 바랍니다.