回答:
方法1:
完全に透明なステータスバーを実現するには、statusBarColor
API 21以降でのみ使用できるを使用する必要があります。windowTranslucentStatus
API 19以降で使用できますが、ステータスバーの背景が薄く表示されます。ただし、設定をwindowTranslucentStatus
行うstatusBarColor
と、transparentに変更しない場合の1つのことが実現されます。それは、フラグSYSTEM_UI_FLAG_LAYOUT_STABLE
とSYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
フラグを設定することです。同じ効果を得る最も簡単な方法は、これらのフラグを手動で設定することです。これにより、Androidレイアウトシステムによって課されたインセットが実質的に無効になり、自分で対処することができます。
onCreate
メソッドで次の行を呼び出します。
getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
/res/values-v21/styles.xmlにも透明度を設定してください:
<item name="android:statusBarColor">@android:color/transparent</item>
または、プログラムで透明度を設定します。
getWindow().setStatusBarColor(Color.TRANSPARENT);
このアプローチの良い面は、色付きの半透明のステータスバーと透明なステータスバーを交換することで、API 19でも同じレイアウトとデザインを使用できることです。
<item name="android:windowTranslucentStatus">true</item>
方法#2:
ビューをその背後に配置するのではなく、ステータスバーの下に背景画像のみを描画する必要がある場合は、メソッドの背景に示すように、アクティビティのテーマの背景を目的の画像に設定し、ステータスバーの透明度を設定するだけです。 1。これは、数か月前にAndroid Policeの記事のスクリーンショットを作成するときに使用した方法です。
方法#3:
一部のレイアウトの標準システムインセットを無視して、他のレイアウトで機能させたままにする必要がある場合、実行可能な唯一の方法は、頻繁にリンクされるScrimInsetsFrameLayout
クラスを操作することです。もちろん、そのクラスで行われることの一部は、すべてのシナリオで必要なわけではありません。たとえば、合成ステータスバーオーバーレイを使用する予定がない場合は、init()
メソッドのすべてをコメントアウトし、attrs.xmlファイルに何も追加しないでください。私はこのアプローチが機能するのを見てきましたが、それは回避するのに多くの作業になるかもしれないいくつかの他の影響をもたらすことがわかるでしょう。
また、複数のレイアウトをラップすることに反対していることもわかりました。1つのレイアウトを別のレイアウトの内側にラップする場合、両方ともmatch_parent
高さと幅を持ち、パフォーマンスへの影響は些細なことなので心配する必要はありません。いずれにしても、拡張するクラスをFrameLayout
他のタイプのLayoutクラスに変更することで、この状況を完全に回避できます。それはうまくいきます。
SYSTEM_UI_FLAG_LAYOUT_STABLE
とSYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
フラグを設定することが私が探していた解決策でした。
CollapsingToolbarLayout
し、Toolbar
完全には半透明ではないステータスバーステーと:android:statusBarColor
何の効果も取らない
これは私のケースでうまくいきました
// Create/Set toolbar as actionbar
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
// Check if the version of Android is Lollipop or higher
if (Build.VERSION.SDK_INT >= 21) {
// Set the status bar to dark-semi-transparentish
getWindow().setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
// Set paddingTop of toolbar to height of status bar.
// Fixes statusbar covers toolbar issue
toolbar.setPadding(0, getStatusBarHeight(), 0, 0);
}
// A method to find height of the status bar
public int getStatusBarHeight() {
int result = 0;
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
result = getResources().getDimensionPixelSize(resourceId);
}
return result;
}
statusBarsの操作の詳細については、youtube.com / watch?v = _mGDMVRO3iEをご覧ください。
このテーマをお試しください
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<item name="colorPrimaryDark">@android:color/transparent</item>
<item name="colorPrimary">@color/md_blue_200</item>
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
<item name="android:statusBarColor">@android:color/transparent</item>
<item name="android:windowTranslucentStatus">true</item>
</style>
レイアウトセットを確認してください
android:fitsSystemWindows="false"
android:fitsSystemWindows="false"
はツールバーを半分にカットしています。
の代わりに
<item name="android:statusBarColor">@android:color/transparent</item>
以下を使用します。
<item name="android:windowTranslucentStatus">true</item>
また、「MainActivity」レイアウトの上部のパディング(デフォルトで追加されています)を必ず削除してください。
これによってステータスバーが完全に透明になるわけではなく、ステータスバーの上に「色あせた黒い」オーバーレイが残ることに注意してください。
<item name="android:windowTranslucentStatus">true</item>
と、ステータスバーの下に色あせた黒い背景がAndroidに表示されますが、これは私が探しているものではありません。この黒い色あせた背景を持たない方法はありますか?
Cody Toombsの解決策は、ほとんど私にとってはトリックでした。これがXamarinに関連するものかどうかはわかりませんが、今では許容できる解決策があります。
これは私のセットアップです:
Android.Support v4およびv7パッケージを参照しているAndroidプロジェクトがあります。2つのスタイルが定義されています。
values / styles.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<resources>
<style name="MyStyle" parent="@style/Theme.AppCompat.Light.NoActionBar">
<item name="android:windowTranslucentStatus">true</item>
</style>
</resources>
values-v21 / styles.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<resources>
<style name="MyStyle" parent="@style/Theme.AppCompat.Light.NoActionBar">
<item name="android:statusBarColor">@android:color/transparent</item>
</style>
</resources>
AndroidManifestは「MyStyle」をターゲットにしています。
AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.agn.test.test">
<uses-sdk android:minSdkVersion="10" />
<application android:allowBackup="true" android:icon="@mipmap/icon" android:label="@string/app_name" android:theme="@style/MyStyle">
</application>
</manifest>
そして最後に、メインアクティビティのコード:
[Activity (Label = "Test", MainLauncher = true, Icon = "@mipmap/icon")]
public class MainActivity : Activity
{
protected override void OnCreate (Bundle savedInstanceState)
{
base.OnCreate (savedInstanceState);
SetContentView (Resource.Layout.Main);
//Resource.Layout.Main is just a regular layout, no additional flags. Make sure there is something in there like an imageView, so that you can see the overlay.
var uiOptions = (int)Window.DecorView.SystemUiVisibility;
uiOptions ^= (int)SystemUiFlags.LayoutStable;
uiOptions ^= (int)SystemUiFlags.LayoutFullscreen;
Window.DecorView.SystemUiVisibility = (StatusBarVisibility)uiOptions;
Window.AddFlags (WindowManagerFlags.DrawsSystemBarBackgrounds);
}
}
DrawsSystemBarBackgroundsフラグを設定したことに注意してください。これにより、すべての違いが生まれます。
Window.AddFlags (WindowManagerFlags.DrawsSystemBarBackgrounds);
私はそれを正しくするために多くの時間を費やしました、実際にはあまりにも多くの時間。うまくいけば、この答えが同じことを達成しようとしている人を助けるでしょう。
android:windowTranslucentStatus
APIレベル19以上が必要ですが、values / styles.xmlでそれをandroid:minSdkVersion
10の値で使用している可能性はありますか?
@Cody Toombsの答えは、ナビゲーションバーの背後にレイアウトをもたらす問題につながります。だから私が見つけたのは@Kritiによって与えられたこの解決策を使っていることです
これは同じためのKotlinコードスニペットです。
if (Build.VERSION.SDK_INT >= 19 && Build.VERSION.SDK_INT < 21) {
setWindowFlag(this, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, true)
}
if (Build.VERSION.SDK_INT >= 19) {
window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
}
if (Build.VERSION.SDK_INT >= 21) {
setWindowFlag(this, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, false)
getWindow().setStatusBarColor(Color.TRANSPARENT)
}
private fun setWindowFlag(activity: Activity, bits: Int, on: Boolean) {
val win: Window = activity.getWindow()
val winParams: WindowManager.LayoutParams = win.getAttributes()
if (on) {
winParams.flags = winParams.flags or bits
} else {
winParams.flags = winParams.flags and bits.inv()
}
win.setAttributes(winParams)
}
また、追加する必要があります
android:fitsSystemWindows="false"
レイアウトのルートビュー。
私は同じ問題を抱えていたので、ステータスバーAPI 19以降の背後に描画するImageViewを作成します
ステータスバーgist.github.comの背後にカスタムイメージを設定する
public static void setTransparent(Activity activity, int imageRes) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
return;
}
// set flags
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
activity.getWindow().setStatusBarColor(Color.TRANSPARENT);
} else {
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
// get root content of system window
//ViewGroup rootView = (ViewGroup) ((ViewGroup) activity.findViewById(android.R.id.content)).getChildAt(0);
// rootView.setFitsSystemWindows(true);
// rootView.setClipToPadding(true);
ViewGroup contentView = (ViewGroup) activity.findViewById(android.R.id.content);
if (contentView.getChildCount() > 1) {
contentView.removeViewAt(1);
}
// get status bar height
int res = activity.getResources().getIdentifier("status_bar_height", "dimen", "android");
int height = 0;
if (res != 0)
height = activity.getResources().getDimensionPixelSize(res);
// create new imageview and set resource id
ImageView image = new ImageView(activity);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, height);
image.setLayoutParams(params);
image.setImageResource(imageRes);
image.setScaleType(ScaleType.MATRIX);
// add image view to content view
contentView.addView(image);
// rootView.setFitsSystemWindows(true);
}
ScrimInsetFrameLayoutを使用できます
android:fitsSystemWindows = "true"はスクリムレイアウトに設定する必要があります!
RelativeLayout
代わりにを使用したい場合はどうなりFrameLayout
ますか?
投稿されたいくつかのソリューションと同様ですが、私の場合、ステータスバーを透明にし、アクションバーの位置を負のマージンで修正しました
if (Build.VERSION.SDK_INT >= 21) {
getWindow().setStatusBarColor(Color.TRANSPARENT);
FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) toolbar.getLayoutParams();
lp.setMargins(0, -getStatusBarHeight(), 0, 0);
}
そして、ツールバーとルートビューで使用しました
android:fitsSystemWindows="true"
良いライブラリがありStatusBarUtilから@laobieは、助けを簡単にステータスバーに画像を描画することは。
を追加してくださいbuild.gradle
:
compile 'com.jaeger.statusbarutil:library:1.4.0'
次に、アクティビティセットで
StatusBarUtil.setTranslucentForImageView(Activity activity, int statusBarAlpha, View viewNeedOffset)
レイアウトで
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"
android:orientation="vertical">
<ImageView
android:layout_alignParentTop="true"
android:layout_width="match_parent"
android:adjustViewBounds="true"
android:layout_height="wrap_content"
android:src="@drawable/toolbar_bg"/>
<android.support.design.widget.CoordinatorLayout
android:id="@+id/view_need_offset"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@android:color/transparent"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"/>
<!-- Your layout code -->
</android.support.design.widget.CoordinatorLayout>
</RelativeLayout>
詳細については、デモをダウンロードするか、githubページからクローンを作成して、すべての機能を試してください。
注:KitKat以上をサポートします。
それが他の誰かを助けることを願っています!
Android Studio 1.4では、ボイラープレートコードを含むテンプレートプロジェクトがOverlay
AppbarLayoutやツールバーにテーマを設定します。また、fitSystemWindow
属性= true によってステータスバーの背後にレンダリングされるように設定されています。これにより、ツールバーのみがステータスバーの真下にレンダリングされ、それ以外はすべてツールバーの下にレンダリングされます。したがって、上記で提供されたソリューションはそれ自体では機能しません。次の変更を行う必要があります。
次のコードをstyles-21.xmlファイルに追加します。
@android:color / transparent
このテーマを、AndroidManifest.xmlファイルのナビゲーションドロワーを含むアクティビティに割り当てます。
これにより、ナビゲーションドロワーが透明なステータスバーの背後にレンダリングされます。
あなたがする必要があるすべてはあなたのテーマでこれらのプロパティを設定することです
<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowTranslucentNavigation">true</item>
受け入れられた回答は、CollapsingToolbarLayoutを使用して私に役立ちました。ただし、setSytstemUiVisibility()
その関数への以前の呼び出しをオーバーライドすることに注意してください。したがって、同じビューの別の場所でその関数を使用している場合はView.SYSTEM_UI_FLAG_LAYOUT_STABLE
、View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
フラグとフラグを含める必要があります。そうしないと、新しい呼び出しでオーバーライドされます。
これは私にとっても当てはまり、私がを呼び出す他の場所に2つのフラグを追加するsetSystemUiVisibility()
と、受け入れられた回答は完全に機能しました。
ここでさらに情報を追加します。最新のAndroid開発により、ステータスバーでの多くのケースの処理が非常に簡単になりました。以下は、からの私の観察ですstyles.xml
<item name="android:windowTranslucentStatus">true</item>
ように、ステータスバーが透明になり、UIの前に表示されます。あなたの活動はトップの全体のスペースを取ります。背景色:SDK 21+の場合<item name="android:statusBarColor">@color/your_color</item>
も、他に影響を与えることなく、ステータスバーに色を付けるだけです。
ただし、以降のデバイス(Android M / +)では、アイコンが異なる色合いで表示されるようになりました。フォルダー内のstyles.xml
ファイルを上書きしてvalues-23
追加すると、OSはSDK 23 / +のアイコンに濃い灰色を与えることができます<item name="android:windowLightStatusBar">true</item>
。
このようにして、ステータスバーの色が明るい場合に、ユーザーに表示されるステータスバーを提供します(Googleアプリの多くの背景が明るいにもかかわらず、アイコンが灰色がかった色で表示されていると考えてください)。
ポイント#2でステータスバーに色を付ける場合は、これを使用することをお勧めします
最新のデバイスでは、SDK 29 / +には、ユーザーが制御できるシステム全体の明るいテーマと暗いテーマが付属しています。開発values-night
者として、ユーザーに2つの異なるエクスペリエンスを提供するために、新しいフォルダーのスタイルファイルをオーバーライドすることも想定されています。
ここでも、ポイント2が「ステータスバーの背景色」を提供するのに効果的であることがわかりました。しかし、システムは私のアプリのステータスバーアイコンの色を変更していませんでした。私の日バージョンのスタイルは明るいテーマで構成されているため、これはユーザーが低い可視性(明るい背景に白いアイコン)に苦しむことを意味します。
この問題は、ポイント#3アプローチを使用するか、values-29
フォルダー内のスタイルファイルを上書きして新しいものを使用することで解決できますapi <item name="android:enforceStatusBarContrast">true</item>
。これにより、背景色が薄すぎる場合、アイコンに灰色がかった色合いが自動的に適用されます。
これを達成するために使用するテーマは次のとおりです。
<style name="AppTheme" parent="@android:style/Theme.NoTitleBar">
<!-- Default Background Screen -->
<item name="android:background">@color/default_blue</item>
<item name="android:windowTranslucentStatus">true</item>
</style>
android:fitsSystemWindows="true"