답변:
방법 # 1 :
완전히 투명한 상태 표시 줄을 얻으려면 statusBarColor
API 21 이상에서만 사용할 수 있는을 사용해야 합니다. windowTranslucentStatus
API 19 이상에서 사용할 수 있지만 상태 표시 줄에 색조 배경을 추가합니다. 그러나 설정 windowTranslucentStatus
은 statusBarColor
투명으로 변경 하지 않고 한 가지를 달성 합니다. 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 파일에 아무것도 추가하지 않아도됩니다. 이 접근 방식이 효과가있는 것을 보았지만이 방법을 사용하면 해결할 수있는 많은 작업이 필요할 수 있습니다.
또한 여러 레이아웃을 래핑하는 것에 반대하는 것을 보았습니다. 하나의 레이아웃을 다른 레이아웃 내부에 배치하는 경우 match_parent
높이와 너비 모두에 영향을 미치므로 성능에 대한 걱정은 너무 사소합니다. 어쨌든 확장 클래스 FrameLayout
를 원하는 다른 유형의 레이아웃 클래스 로 변경하여 이러한 상황을 완전히 피할 수 있습니다 . 잘 작동합니다.
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>
안드로이드가 내가 찾고있는 것이 아닌 상태 표시 줄 아래에 어두운 검은 색 배경을 넣습니다. 이 검은 색 배경을 가지지 않는 방법이 있습니까?
Cody Toombs의 솔루션은 거의 나를 위해 속임수를 사용했습니다. 이것이 Xamarin 과 관련 이 있는지 확실 하지 않지만 이제 수용 가능한 해결책이 있습니다.
이것은 내 설정입니다.
Android.Support v4 및 v7 패키지를 참조한 Android 프로젝트가 있습니다. 두 가지 스타일이 정의되어 있습니다.
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 이상이 필요합니다. 값android:minSdkVersion
이 10 인 동안 values / styles.xml 에서 API를 어떻게 사용할 수 있습니까?
@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"
@laobie의 StatusBarUtil 라이브러리는 StatusBar 에서 이미지를 쉽게 그릴 수 있도록 도와줍니다.
에 추가하십시오 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 : 컬러 / 투명
이 테마를 AndroidManifest.xml 파일 의 탐색 창을 포함하는 활동에 지정 하십시오.
그러면 탐색 드로어가 투명 상태 표시 줄 뒤에서 렌더링됩니다.
수락 된 답변은 CollapsingToolbarLayout을 사용하여 저에게 효과적이었습니다. 그러나 setSytstemUiVisibility()
해당 함수에 대한 이전 호출을 재정의하는 것이 중요 합니다. 따라서 동일한 뷰에서 다른 곳에서 해당 함수를 사용하는 경우 View.SYSTEM_UI_FLAG_LAYOUT_STABLE
and View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
플래그 를 포함해야합니다. 그렇지 않으면 새 호출로 재정의됩니다.
이것은 나를위한 경우이며, 전화를 걸고있는 다른 장소에 두 개의 플래그를 추가 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"