Lollipop: vẽ phía sau statusBar với màu được đặt thành trong suốt


142

Tôi đã đặt màu statusBar của mình thành trong suốt cho Lollipop chỉ với dòng sau trong chủ đề của mình:

<item name="android:statusBarColor">@android:color/transparent</item>

Bây giờ tôi cần vẽ phía sau nó, nhưng tôi không thể có bất kỳ góc nhìn nào phía sau nó. Tôi biết cách làm điều đó với thuộc windowTranslucentStatustính, nhưng không muốn sử dụng thuộc tính này vì sau đó nó sẽ bỏ qua màu của statusBar được đặt thành trong suốt.


2
Bạn cũng có thể sử dụngandroid:fitsSystemWindows="true"
Aznix

Câu trả lời:


385

Phương pháp số 1:

Để đạt được một thanh trạng thái hoàn toàn trong suốt, bạn phải sử dụng statusBarColor, chỉ có trên API 21 trở lên. windowTranslucentStatuscó sẵn trên API 19 trở lên, nhưng nó thêm nền được tô màu cho thanh trạng thái. Tuy nhiên, cài đặt windowTranslucentStatusđạt được một điều mà thay đổi statusBarColorthành trong suốt thì không: nó đặt cờ SYSTEM_UI_FLAG_LAYOUT_STABLESYSTEM_UI_FLAG_LAYOUT_FULLSCREENcờ. Cách dễ nhất để có được hiệu ứng tương tự là thiết lập thủ công các cờ này, điều này vô hiệu hóa hiệu quả các phần tử được áp đặt bởi hệ thống bố cục Android và để bạn tự bảo vệ mình.

Bạn gọi dòng này trong onCreatephương thức của bạn :

getWindow().getDecorView().setSystemUiVisibility(
    View.SYSTEM_UI_FLAG_LAYOUT_STABLE
    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);

Hãy chắc chắn cũng đặt độ trong suốt trong /res/values-v21/styles.xml:

<item name="android:statusBarColor">@android:color/transparent</item>

Hoặc đặt độ trong suốt theo chương trình:

getWindow().setStatusBarColor(Color.TRANSPARENT);

Mặt tốt của phương pháp này là các bố cục và thiết kế tương tự cũng có thể được sử dụng trên API 19 bằng cách giao dịch trên thanh trạng thái trong suốt cho thanh trạng thái mờ được tô màu.

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

Phương pháp # 2:

Nếu bạn chỉ cần vẽ một hình nền dưới thanh trạng thái của mình, thay vì định vị một khung nhìn phía sau nó, điều này có thể được thực hiện bằng cách chỉ cần đặt nền của chủ đề hoạt động của bạn thành hình ảnh mong muốn và đặt độ trong suốt của thanh trạng thái như trong phương thức # 1. Đây là phương pháp tôi đã sử dụng để tạo ảnh chụp màn hình cho bài viết của Cảnh sát Android từ vài tháng trước.

Phương pháp # 3:

Nếu bạn phải bỏ qua các phần tử hệ thống tiêu chuẩn cho một số bố cục trong khi vẫn giữ chúng hoạt động ở các phần khác, cách duy nhất khả thi để làm điều đó là làm việc với lớp thường được liên kết ScrimInsetsFrameLayout. Tất nhiên, một số điều được thực hiện trong lớp đó không cần thiết cho tất cả các kịch bản. Ví dụ: nếu bạn không có kế hoạch sử dụng lớp phủ thanh trạng thái tổng hợp, chỉ cần nhận xét mọi thứ trong init()phương thức và không bận tâm thêm bất cứ điều gì vào tệp attrs.xml. Tôi đã thấy cách tiếp cận này hiệu quả, nhưng tôi nghĩ rằng bạn sẽ thấy rằng nó mang lại một số hàm ý khác có thể là rất nhiều công việc phải giải quyết.

Tôi cũng thấy rằng bạn phản đối việc gói nhiều bố cục. Trong trường hợp bọc một bố cục bên trong một bố cục khác, trong đó cả hai đều có match_parentchiều cao và chiều rộng, ý nghĩa về hiệu suất quá tầm thường để lo lắng. Bất kể, bạn có thể tránh hoàn toàn tình huống đó bằng cách thay đổi lớp mà nó mở rộng từ FrameLayoutbất kỳ loại Bố cục nào khác mà bạn thích. Nó sẽ chỉ làm việc tốt.


9
Cảm ơn rất nhiều, thiết lập SYSTEM_UI_FLAG_LAYOUT_STABLESYSTEM_UI_FLAG_LAYOUT_FULLSCREENcờ là giải pháp tôi đang tìm kiếm.
alxscms

3
Tôi đã tìm kiếm giải pháp đầu tiên của bạn trong một tháng. Cảm ơn bạn!
NeoKree 16/2/2015

1
Chào. Mã của bạn hoạt động hoàn toàn tốt. Nhưng khi tôi thoát khỏi đoạn, tôi nên thay đổi như thế nào?
TheOnlyAnil

3
Điều này không hoạt động với CollapsingToolbarLayoutToolbar: thanh trạng thái không hoàn toàn mờ và android:statusBarColorkhông có hiệu lực
Konstantin Konopko

Cảm ơn. Nếu sau đó bạn muốn quay trở lại hoạt động không toàn màn hình, hãy đọc developer.sonymobile.com/ledgeledge-base/tutorials/ trộm .
CoolMind

43

Điều này làm việc cho trường hợp của tôi


// 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;
}

Để biết thêm thông tin về cách làm việc với statusBars: youtube.com/watch?v=_mGDMVRO3iE



@TheOnlyAnil xác định chiều cao thanh công cụ cố định :) "56dp" hoặc như vậy sẽ trông tốt
Michael

4
Lấy chiều cao của thanh trạng thái như thế này là hoàn toàn không được hỗ trợ, không có giấy tờ và chắc chắn sẽ phá vỡ trong các phiên bản trong tương lai. Thay vào đó, hãy sử dụng fitSystemWindows = "true".
Greg Enni

1
Vâng, tôi đang làm điều đó cũng gây ra đôi khi bạn phải làm.
Greg Enni

2
Đây là một ý tưởng rất tồi tệ, theo Chris Banes (Kỹ sư Google) trong buổi nói chuyện này: youtube.com/watch?v=_mGDMVRO3iE
Martin Marconcini

1
@Michael FWIW, tôi đã làm điều này trong quá khứ và WindowInsets api một (phương pháp) để thực hiện điều này nên đơn giản và được thực hiện mà không cần chúng tôi phải suy nghĩ về nó, nhưng không, đó là một API vô dụng khập khiễng nhiều chi phí không cần thiết Google luôn hoàn thành 80% và để lại 20% cuối cùng cho các nhà phát triển, những người hack tất cả các cách cho đến khi họ thực hiện được. _ (ツ) _ /
Martin Marconcini

21

Hãy thử chủ đề này

<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>

Hãy chắc chắn rằng, bộ bố trí của bạn

android:fitsSystemWindows="false"

4
thiết lập android:fitsSystemWindows="false"đang cắt thanh công cụ một nửa.
Hammad Nasir

16

Thay vì

<item name="android:statusBarColor">@android:color/transparent</item>

Sử dụng như sau:

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

Và đảm bảo xóa phần đệm trên cùng (được thêm theo mặc định) trên bố cục 'MainActivity' của bạn.

Lưu ý rằng điều này không làm cho thanh trạng thái hoàn toàn trong suốt và vẫn sẽ có lớp phủ "đen mờ" trên thanh trạng thái của bạn.


2
Khi sử dụng <item name="android:windowTranslucentStatus">true</item>, nó làm cho Android đặt một nền đen mờ dưới thanh trạng thái không phải là thứ tôi đang tìm kiếm. Bất kỳ cách nào để không có nền đen mờ này?
alxscms

1
Tôi đã thử nhiều thứ, nhưng tôi không thể tìm ra cách xóa nền đen mờ. Do đó, tôi đang kết thúc nghiên cứu của mình bằng cách nói rằng điều đó là không thể trên Android (thậm chí không phải với ScrimLayout). Loại này có ý nghĩa, bởi vì nó đảm bảo khả năng đọc đúng của thanh trạng thái của bạn mọi lúc. Tôi sẽ cập nhật câu trả lời của tôi ở trên.
Jeroen Mols

Tôi nghĩ sẽ rất kỳ lạ khi có thể đặt một màu trong suốt vào thanh trạng thái, mà không thể vẽ phía sau nó. Tôi hiểu lý do tại sao bạn nói điều đó có ý nghĩa rằng bạn không thể xóa nền mờ màu đen này, nhưng chắc chắn không khó để đủ cẩn thận để giữ biểu tượng trên thanh trạng thái. Dưới đây là một bài viết của cảnh sát android cho thấy việc sử dụng một thanh trạng thái trong suốt androidpolice.com/2014/07/04/ . Tôi sẽ cố gắng liên lạc với tác giả.
alxscms

1
Hy vọng bạn có thể liên lạc với anh ta. Tôi cũng đang rất thích làm điều này :)
Jeroen Mols 17/1/2015

Tuyệt quá! Cập nhật câu trả lời của tôi là tốt.
Jeroen Mols

9

Giải pháp từ Cody Toombs gần như đã giúp tôi. Tôi không chắc đây có liên quan đến Xamarin hay không, nhưng giờ tôi có một giải pháp chấp nhận được:

Thí dụ

Đây là thiết lập của tôi:

Tôi có một dự án Android nơi tôi đã tham chiếu các gói Android.S4 v4 và v7. Tôi có hai kiểu được định nghĩa:

giá trị / style.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>

value-v21 / style.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>

Mục tiêu 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>

Và cuối cùng là mã trong Hoạt động chính:

[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);
    }
}

Lưu ý rằng tôi đặt cờ DrawsSystemBarBackgrounds, điều này tạo ra sự khác biệt

Window.AddFlags (WindowManagerFlags.DrawsSystemBarBackgrounds); 

Tôi đã dành rất nhiều thời gian để làm cho đúng, quá nhiều thời gian trên thực tế. Hy vọng câu trả lời này sẽ giúp bất cứ ai cố gắng đạt được điều tương tự.


1
android:windowTranslucentStatusyêu cầu API cấp 19 trở lên, làm sao bạn có thể sử dụng nó trên các giá trị / style.xml của bạn trong khi có android:minSdkVersion10?
mradzinski

7

Câu trả lời của @Cody Toombs dẫn đến một vấn đề mang lại bố cục phía sau thanh điều hướng. Vì vậy, những gì tôi tìm thấy là sử dụng này giải pháp được cung cấp bởi @Kriti

đây là đoạn mã Kotlin cho cùng:

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)
}

Bạn cũng cần thêm

android:fitsSystemWindows="false"

xem gốc của bố cục của bạn.


3

Tôi gặp vấn đề tương tự vì vậy tôi tạo ImageView rút ra sau thanh trạng thái API 19+

Đặt hình ảnh tùy chỉnh phía sau Thanh trạng thái 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);

}

2

Bạn có thể sử dụng ScrimInsetFrameLayout

https://github.com/google/iosched/blob/master/android/src/main/java/com/google/samples/apps/iosched/ui/widget/ScrimInsetsFrameLayout.java

android: fitSystemWindows = "true" nên đặt trên bố cục scrim!


Tôi đã thấy lớp đó nhưng nếu tôi muốn sử dụng RelativeLayoutthay vì a FrameLayoutthì sao?
alxscms

3
sử dụng bố trí tương đối bên trong một framelayout.
Murtaza Khursheed Hussain

2
Bố trí lồng nhau trong bố cục chắc chắn không phải là một giải pháp cho tôi về hiệu suất
alxscms

1
hiệu suất ứng dụng phụ thuộc vào nhiều thứ có thể thay đổi. nếu bạn không có cách nào hãy thử. Điều may mắn nhất
Murtaza Khursheed Hussain

Tôi hiểu ý của bạn, nhưng phải có một giải pháp khác, nếu không, có thể có một cách để thực hiện trên bất kỳ bố cục nào đã được thực hiện trong bố cục khung tùy chỉnh này. Nhưng cảm ơn bằng mọi cách
alxscms 14/1/2015

1

Tương tự như một số giải pháp được đăng, nhưng trong trường hợp của tôi, tôi đã minh bạch thanh trạng thái và sửa vị trí của thanh hành động với một số lề âm

if (Build.VERSION.SDK_INT >= 21) {
    getWindow().setStatusBarColor(Color.TRANSPARENT);
    FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) toolbar.getLayoutParams();
    lp.setMargins(0, -getStatusBarHeight(), 0, 0);
}

Và tôi đã sử dụng trong thanh công cụ và chế độ xem gốc

android:fitsSystemWindows="true"

1
getStatusBarHeight () không chuẩn
Roel

Phương pháp này được triển khai trên giải pháp từ @ mike-milla ... public int getStatusBarHeight () {int result = 0; int resourceId = getResource (). getIdentifier ("status_bar_height", "dimen", "android"); if (resourceId> 0) {result = getResource (). getDimensionPixelSize (resourceId); } kết quả trả về; }
jegumi

Cảm ơn. Tôi đã làm như vậy: AppBarLayout.LayoutParams lp = (AppBarLayout.LayoutParams) thanh công cụ.getLayoutParams (); lp.topMargin + = getStatusBarHeight ();
CoolMind

1

Có thư viện StatusBarUtil tốt từ @laobie giúp dễ dàng vẽ hình ảnh trong StatusBar.

Chỉ cần thêm vào build.gradle:

compile 'com.jaeger.statusbarutil:library:1.4.0'

Sau đó, trong tập Hoạt động

StatusBarUtil.setTranslucentForImageView(Activity activity, int statusBarAlpha, View viewNeedOffset)

Trong cách bố trí

<?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>

Để biết thêm thông tin tải về bản demo hoặc bản sao từ trang github và chơi với tất cả các tính năng.

Lưu ý: Hỗ trợ KitKat trở lên.

Hy vọng rằng sẽ giúp người khác!


0

Với Android Studio 1.4, dự án mẫu với mã tấm nồi hơi đặt Overlaychủ đề trên AppbarLayout và / hoặc Thanh công cụ của bạn. Chúng cũng được đặt để được hiển thị phía sau thanh trạng thái theo fitSystemWindowthuộc tính = true. Điều này sẽ khiến chỉ thanh công cụ được hiển thị ngay bên dưới thanh trạng thái và mọi thứ khác sẽ được hiển thị bên dưới thanh công cụ. Vì vậy, các giải pháp được cung cấp ở trên sẽ không tự hoạt động. Bạn sẽ phải thực hiện các thay đổi sau đây.

  • Xóa chủ đề Lớp phủ hoặc thay đổi thành chủ đề không lớp phủ cho thanh công cụ.
  • Đặt đoạn mã sau vào style-21.xml của bạn tệp .

    @android: màu / trong suốt

  • Gán chủ đề này cho hoạt động chứa ngăn kéo điều hướng trong tệp AndroidManifest.xml .

Điều này sẽ làm cho ngăn kéo Điều hướng hiển thị phía sau thanh trạng thái trong suốt.


0

Tất cả bạn cần làm là đặt các thuộc tính này trong chủ đề của bạn

<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowTranslucentNavigation">true</item>

1
Tôi khá chắc chắn rằng điều này sẽ làm cho bố cục của bạn nằm bên dưới các nút điều hướng UI (thiết bị có điều hướng trên màn hình). Điều này khiến chế độ xem điều hướng phía dưới không thể truy cập được trong ứng dụng của chúng tôi, vì vậy chúng tôi đã bỏ các cờ này sau khi thử nghiệm trên Nexus
EpicPandaForce

0

Câu trả lời được chấp nhận làm việc cho tôi bằng cách sử dụng CollapsingToolbarLayout. Tuy nhiên, điều quan trọng cần lưu ý là setSytstemUiVisibility()ghi đè bất kỳ cuộc gọi trước nào đến chức năng đó. Vì vậy, nếu bạn đang sử dụng chức năng đó ở một nơi khác cho cùng một chế độ xem, bạn cần bao gồm View.SYSTEM_UI_FLAG_LAYOUT_STABLEView.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN cờ cờ, nếu không chúng sẽ bị ghi đè với cuộc gọi mới.

Đây là trường hợp của tôi và khi tôi thêm hai lá cờ vào nơi khác tôi đang thực hiện cuộc gọi đến setSystemUiVisibility(), câu trả lời được chấp nhận đã hoạt động hoàn hảo.


0

Tôi sẽ thêm một số thông tin ở đây. Các phát triển mới nhất của Android đã giúp việc xử lý rất nhiều trường hợp trên thanh trạng thái trở nên khá dễ dàng. Sau đây là những quan sát của tôi từstyles.xml

  1. Màu nền : cho SDK 21+, như rất nhiều câu trả lời được đề cập, <item name="android:windowTranslucentStatus">true</item> sẽ làm cho thanh trạng thái trong suốt và hiển thị trước giao diện người dùng. Hoạt động của bạn sẽ chiếm toàn bộ không gian trên cùng.
  2. Màu nền : một lần nữa, đối với SDK 21+, <item name="android:statusBarColor">@color/your_color</item>sẽ chỉ đơn giản là cung cấp màu cho thanh trạng thái của bạn mà không ảnh hưởng đến bất kỳ điều gì khác.

  3. Tuy nhiên, trong các thiết bị sau này (Android M / +), các biểu tượng bắt đầu xuất hiện ở các sắc thái khác nhau. HĐH có thể cung cấp màu xám đậm hơn cho các biểu tượng cho SDK 23 / +, nếu bạn ghi đè styles.xmltệp của mình vào values-23thư mục và thêm <item name="android:windowLightStatusBar">true</item>.
    Bằng cách này, bạn sẽ cung cấp cho người dùng của mình một thanh trạng thái rõ ràng hơn, nếu thanh trạng thái của bạn có màu sáng (hãy nghĩ xem có bao nhiêu ứng dụng google có nền sáng nhưng các biểu tượng có thể nhìn thấy ở đó có màu xám).
    Tôi sẽ đề nghị bạn sử dụng cái này, nếu bạn đang tô màu cho thanh trạng thái của mình thông qua điểm # 2

  4. Trong các thiết bị gần đây nhất, SDK 29 / + đi kèm với chủ đề sáng và tối toàn hệ thống, được người dùng kiểm soát. Là nhà phát triển, chúng tôi cũng có nghĩa vụ ghi đè tệp kiểu của chúng tôi trong một values-nightthư mục mới , để cung cấp cho người dùng 2 trải nghiệm khác nhau.
    Ở đây một lần nữa, tôi đã tìm thấy điểm # 2 có hiệu quả trong việc cung cấp "màu nền cho thanh trạng thái". Nhưng hệ thống không thay đổi màu sắc của các biểu tượng trên thanh trạng thái cho ứng dụng của tôi. do phiên bản ngày của tôi bao gồm chủ đề nhẹ hơn, điều này có nghĩa là người dùng sẽ bị ảnh hưởng thấp (biểu tượng màu trắng trên nền sáng hơn)
    Vấn đề này có thể được giải quyết bằng cách sử dụng cách tiếp cận điểm # 3 hoặc ghi đè tệp kiểu trong values-29thư mục và sử dụng tệp mới hơn api <item name="android:enforceStatusBarContrast">true</item>. Điều này sẽ tự động thực thi tông màu xám cho các biểu tượng, nếu màu nền của bạn quá nhạt.


-1

Đây là chủ đề tôi sử dụng để thực hiện điều này:

<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>

1
Có một số downvoters lạ. Ngay cả khi một giải pháp phù hợp với bạn và một số người khác, họ sẽ hạ thấp thay vì chuyển sang câu trả lời khác.
CoolMind

Tất cả tôi đang yêu cầu là một lời giải thích. Tôi không nghĩ mọi người sẽ có thể downvote mà không cần một lời giải thích.
Droid Chris

Tôi cũng nghĩ vậy.
CoolMind

Tôi sẽ giải thích tùy chọn nền không hoạt động chính xác trong gói này. Xin hãy trả lời đúng.
Morozov

Hmmm ... phiên bản Android nào bạn đang làm điều này? Tôi đang sử dụng cấu hình này trong Android M.
Droid Chris

-3

Giải pháp đúng là Thay đổi một thuộc tính trong XML dưới thẻ Activity của bạn thành kiểu bên dưới. Nó chỉ hoạt động

  android:theme="@style/Theme.AppCompat.Light.NoActionBar"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.