Androidアクティビティでナビゲーションバーを永続的に非表示にする方法は?


80

アクティビティでナビゲーションバーを永続的に非表示にしたい(システムUI全体ではない)。今、私はこのコードを使用しています

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

バーは非表示になりますが、ユーザーが画面に触れると再び表示されます。活動するまでそれを永久に隠す方法はありますかonStop();



この公式のGoogle / Androidリンク:フルスクリーンモードを有効にするで、多くの優れた具体的な詳細がここに示されています
クリススプレーグ

ドキュメントによると、ユーザーが画面に触れると、フラグは自動的にクリアされます。ナビゲーションバーを常に非表示にするには、UIデザインを変更する必要があります。
user11543 9020年

回答:


118

切れ端:

FullScreenFragment.java

HideNavigationBarComponent.java


これはAndroid4.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);
    }
}

ナビゲーションバーに表示される音量大または音量小を押したときに問題が発生した場合。setOnSystemUiVisibilityChangeListeneronCreate参照してコードを追加しました

別の関連する質問があります:

没入型モードのナビゲーションは、音量を押したり最小に戻したりするとスティッキーになります


4
ユーザーが画面の上下をスワイプすると、半透明のナビゲーションバーが一時的に表示され、その後再び非表示になります。それも隠すことは可能ですか?
ファインダー

@KarthickRamu私は方法を見つけました、ちょうど私の答えを見てください:)
Muhammed

1
@MuhammedRefaatあなたのヒントにはroot化されたデバイスが必要です:(
Finder

1
@DawidDrozdありがとうございますが、問題があります。アクティビティのルートレイアウトはRelativeLayoutであり、android:layout_alignParentBottom = "true"に設定された子ビューがあり、ナビゲーションバーは消えますが、子ビューは下端に移動しません画面の、ナビゲーションバーが消えないで非表示に設定されているかのように、あなたは助けることができますか?
ジャック

1
ナビゲーションバーが占めていたスペースを利用したい場合android:fitsSystemWindows="true"は、ビューからすべての出現箇所を削除する必要があります。Android Studioには、一部のレイアウトを生成するときにこの属性が含まれています。stackoverflow.com/a/42501330/650894
JoeLapp19年

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

より単純なソリューションを検討している人にとっては、この1行のコードを 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()。setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.onStart(); } `` `
BilalYaqoob20年

4

Android開発者サイトによると

(私が知る限り)ナビゲーションバーを永久に隠すことはできないと思います。

ただし、1つのトリックを行うことができます。そのトリックはあなたを気にします。

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

ナビゲーションバーを非表示にする2番目のcreateメソッド。

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

したがって、ビューの作成の開始時に1回の呼び出しで、タブレットのナビゲーションを永続的に非表示にすることはできません。非表示になりますが、画面をタッチするとポップアップします。したがって、画面を2回タッチするだけで、レイアウトに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 2017

1

他の回答は主にのsetSystemUiVisibility()メソッドのフラグを使用しViewます。ただし、このAPIはAndroid 11以降非推奨になっています。詳細については、システムUIの可視性の変更に関する私の記事を確認してください。この記事では、カットアウトを適切に処理する方法や、可視性の変化を聞く方法についても説明しています。

新しい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機能を利用するには、他に何を設定する必要がありますか?
エンジェルコ

@AngelKoh非表示にする場合は、hideSystemUI()を手動で呼び出す必要があります。私の答えに記載されている記事を確認してください。これらすべての詳細が含まれています。スティッキーモードとは、ユーザーがバーを上にスワイプするとバーが透明になり、アプリがタッチイベントも受信することを意味します(developer.android.com/training/system-ui/…を参照)。
ミロシュČernilovský

はいhideSystemUI()が呼び出され、Uiが最初に非表示になりました。ただし、後で画面をタッチすると、ナビゲーションバーが飛び出し、表示されたままになります。
エンジェルコ

BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPEの目的は、システムがタッチを盗んでバーを表示するのを防ぐことです。そのため、実際のアプリを確認/デバッグせずに、これを引き起こす原因がわかりません。
ミロシュČernilovský

0

これを試して:

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

いいえ、同じ結果が得られます
Sujith Manjavana 2014

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.