Как скрыть панель навигации постоянно в Android активность?

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

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

он скрывает панель, но когда пользователь касается экрана, он снова отображается. есть ли способ скрыть его навсегда, пока activity onStop();

8 ответов


фрагменты:

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

вот еще один вопрос:

иммерсивный режим навигации становится липким после нажатия громкости или минимизировать-восстановить


сделать это.

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() метод.


использовать:-

view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);

в планшетах под управлением Android 4+ невозможно скрыть панель системы / навигации.

С документация :

SYSTEM_UI_FLAG_HIDE_NAVIGATION-это новый флаг, который запрашивает панель навигации полностью скрыта. Помните, что это работает только для панель навигации, используемая некоторыми телефонами (она не скрывает системную панель на таблетки.)


по данным сайт разработчика 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);
}

Посмотреть больше информации об этом ..

скрыть системную панель в Таблетки


Я думаю, что код удара поможет вам и добавит этот код перед setContentView ()

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

добавьте этот код за setContentView() getWindow().getDecorView().setSystemUiVisibility(просмотр.SYSTEM_UI_FLAG_LOW_PROFILE);


Это проблема безопасности: https://stackoverflow.com/a/12605313/1303691

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


попробуйте это.

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

дайте мне знать, если это помогает... :)


Это мое решение:

во-первых, определите логическое значение, указывающее, видна или нет панель навигации.

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