58

Android M では、ステータス バーのアイコンを暗くする機能があります。これを行うには、テーマの xml で属性を指定できます。

<item name="android:windowLightStatusBar">true</item>

または、次のコードを使用して実行時に設定します。

View someView = findViewById(R.id.some_view);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    someView.setSystemUiVisibility(someView.getSystemUiVisibility() | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
}

そして、それは実際にうまく機能します。しかし問題は、実行時にステータス バー モードを適切にダークに設定する方法です。

私はすでにこれらの変種を試しました:

// Makes status bar mode dark, but also hides it along with all navigation views. 
someView.setSystemUiVisibility(someView.getSystemUiVisibility() | ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);

// Does nothing 
someView.setSystemUiVisibility(someView.getSystemUiVisibility() & ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);

// Also does nothing 
someView.setSystemUiVisibility(someView.getSystemUiVisibility() ^ View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);

では、どうすれば正しい方法で行うことができるのでしょうか?

4

14 に答える 14

65

@Aracem によって投稿されたソリューションは有効ですが、ステータス バーの背景色も変更しようとすると機能しません。私の場合は以下の方法で行っています。

windowLightStatusBar を有効にするには (たとえば、Utils クラス内でプログラムによって):

 public static void setLightStatusBar(View view,Activity activity){


            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

                int flags = view.getSystemUiVisibility();
                flags |= View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
                view.setSystemUiVisibility(flags);
                activity.getWindow().setStatusBarColor(Color.WHITE); 
            }
}

StatusBar を以前の状態に戻すには:

  public static void clearLightStatusBar(Activity activity) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            Window window = activity.getWindow();
            window.setStatusBarColor(ContextCompat
                 .getColor(activity,R.color.colorPrimaryDark)); 
        }
    }

ステータスバーの色を元に戻すだけで十分です。アイコンの色も元に戻します。非常に重要: setLightStatusBar(View view..) で使用されているビューが画面から消える (つまり、view.getVisibility()==GONE|INVISIBLE) まで、復元操作は行われません。

于 2016-09-20T14:26:06.510 に答える
51

Nick Butcher のプロジェクト "Plaid" によると

public static void clearLightStatusBar(@NonNull View view) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        int flags = view.getSystemUiVisibility();
        flags &= ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
        view.setSystemUiVisibility(flags);
    }
}

このファイルはここにあります

于 2016-07-11T16:57:38.193 に答える
5

SDK の API 30 に若干の変更があり、現在、ライト ステータス バーの外観は、 Windowから取得できるWindowInsetsControllerによって制御されます。以下は Kotlin のサンプル メソッド (アクティビティ内) で、古い Android SDK バージョンで以前に使用されていたView.setSystemUiVisibilityと新しい API を組み合わせています。これはステータス バーのシステム アイコンの外観のみを変更し、ステータス バーの実際の色はWindow.setStatusBarColorで設定できることに注意してください。

@Suppress("DEPRECATION")
private fun setSystemUiLightStatusBar(isLightStatusBar: Boolean) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
            val systemUiAppearance = if (isLightStatusBar) {
                WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS
            } else {
                0
            }
            window.insetsController?.setSystemBarsAppearance(systemUiAppearance,
                                                             WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS)
        } else {
            val systemUiVisibilityFlags = if (isLightStatusBar) {
                window.decorView.systemUiVisibility or SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
            } else {
                window.decorView.systemUiVisibility and SYSTEM_UI_FLAG_LIGHT_STATUS_BAR.inv()
            }
            window.decorView.systemUiVisibility = systemUiVisibilityFlags
        }
    }
}
于 2020-11-11T13:04:27.837 に答える
0

青色の背景色のステータス バーを薄いテキスト色のkotlinバージョンで設定する

fun setBlueStatusBarColor(window: Window, context: Context) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            window.statusBarColor = context.getColor(R.color.colorBlue)
        }else {
            window.statusBarColor = context.resources.getColor(R.color.colorBlue)
        }

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            var flags: Int = window.decorView.systemUiVisibility
            flags = flags and View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
            window.decorView.systemUiVisibility = flags
        }
    }
}
于 2020-06-27T05:12:55.247 に答える