6

没入モードの使用時に問題に直面しています。これが私がすべてのアクティビティに付けたコードです:

 @Override
 public void onWindowFocusChanged(boolean hasFocus) {
     super.onWindowFocusChanged(hasFocus);
     if (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
         );
     }
 }

とが見えないnavigationBarstatusBarこれはいい。

問題は、別のアクティビティに行くたびに がnavigationBar表示されてから消えることです。そのように表示されないことを望みnavigationBarます。

4

5 に答える 5

6

最も簡単な作業方法は、次のような基本アクティビティ クラスを作成することです。

public abstract class BaseActivity extends AppCompatActivity {

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

        enableImmersiveMode();
    }

    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);

        if(hasFocus) {
            enableImmersiveMode();
        }
    }

    protected void enableImmersiveMode() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            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
            );
        }
    }
}

また、没入型モードで動作する必要があるすべてのアクティビティは、上記の基本クラスから継承する必要があります。

私はちょうどそれをテストしました。アクティビティの変更中に画面上のメニューが非表示になったり表示されたりするのを防ぎます。

于 2016-07-05T09:35:52.737 に答える
3

遅いかもしれませんが、今私はあなたと同じ問題に直面し、この投稿に出くわしました。好奇心によって、私は自分に合った解決策を見つけました。関数「onWindowFocusChanged」を手動で呼び出し、「true」パラメーターを渡しました。「setContentView(R.layout.activity_main);」の前に、OnCreate でその関数を呼び出しました。レイアウトが追加される前に、関数を実行して没入モード (フルスクリーン) を設定すると、ナビゲーション バーとステータス バーの非表示アニメーションが表示されなくなりました。お役に立てば幸いです。

これはコードです:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    onWindowFocusChanged(true);
    setContentView(R.layout.activity_main);
}

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    if (hasFocus) {
        getWindow().getDecorView().setSystemUiVisibility(
                View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                        | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                        | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                        | View.SYSTEM_UI_FLAG_FULLSCREEN
                        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                        | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);}
}
于 2017-01-06T20:58:35.287 に答える
3

次の例のように、アクティビティのメソッド onCreate でこの短いコードを呼び出すと、次のようになります。

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

 // This snippet hides the system bars.
    private void hideSystemUI() {
        // Set the IMMERSIVE flag.
        // Set the content to appear under the system bars so that the content
        // doesn't resize when the system bars hide and show.
        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 // hide nav bar
                        | View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar
                        | View.SYSTEM_UI_FLAG_IMMERSIVE);
    }

また、 onWindowFocusChangedでもメソッドを呼び出す必要があります。

これがお役に立てば幸いです=)

于 2015-03-25T18:17:16.550 に答える
2

私もこの問題に直面しました。構成の変更後に Android がナビゲーション バーを再び表示するのを止める方法はないようです。

さらに悪いことに、システム UI が正確に復元される時期も保証されていません。一部のデバイスでの私のテストによると、ナビゲーション バーは呼び出されたonWindowFocusChanged後でも再表示されます。onResume

望ましくないUIの再表示を防ぐために私が見つけた唯一の信頼できる方法は、isInFullScreenModeブールフラグを追加しView.OnSystemUiVisibilityChangeListenerて次のようなものを実装することです:

@Override
public void onSystemBarsVisible() {
    if (isInFullScreenMode) {
        // If Android presented system bars 
        // but our app doesn't need them at this point 
        // just call hideSystemUi() again
        hideSystemUi();
        return;
    }
}

@Override
public void onSystemBarsHidden() {
    if (!isInFullScreenMode) {
        // Similar technique as shown above
        showSystemUi();
        return;
    }
}

もちろん、回転すると、システム バーがどのようにすばやく表示されたり消えたりするかを確認できる場合があります。しかし、少なくともアプリの UI の状態が確実に復元されることは確実です。

編集:(コメントに見られるように)混乱を防ぐために、いくつかのことを明確にします。

  • onSystemBarsVisible私のアプリで定義されonSystemBarsHiddenたカスタムメソッドです。Android フレームワークにはありません。
  • ここoverrideでキーワードが使用されているのは、これらのメソッドがコントラクト (インターフェイス) の一部であったためです。
  • この機能を使用したアプリは現在廃止されています。ただし、基本的な考え方は次のとおりだったことを今でも覚えています (Kotlin のスニペット)。
fun onSystemUiVisibilityChange(visibility: Int) {
    if (visibility and View.SYSTEM_UI_FLAG_FULLSCREEN == 0) {
        // The system bars are visible
        onSystemBarsVisible()
    } else {
        // The system bars are NOT visible.
        onSystemBarsHidden()
    }
}
于 2017-03-14T18:46:14.393 に答える
0

setSystemUiVisibility本当の解決策は、 と の両方onResumeでを呼び出すことonWindowFocusChangedです。

@Override
protected void onResume() {
    super.onResume();
    hide();
}

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    hide();
}

public void hide() {
    getWindow().getDecorView().setSystemUiVisibility(
            View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |
            View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION |
            View.SYSTEM_UI_FLAG_FULLSCREEN |
            View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY |
            View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
            View.SYSTEM_UI_FLAG_LAYOUT_STABLE);           
}
于 2016-08-10T17:36:25.777 に答える