Thanh trạng thái và thanh tác vụ trong suốt của Android


97

Tôi đã thực hiện một số nghiên cứu về chủ đề này và tôi không thể tìm ra giải pháp hoàn chỉnh, vì vậy, từng bước và với một số thử nghiệm và sai sót, cuối cùng tôi tìm ra cách chúng ta có thể đạt được những kết quả này: có một trong suốt hoặc có màu ActionbarStatusbar. Xem câu trả lời của tôi dưới đây.

Câu trả lời:


238

Tôi đang phát triển một ứng dụng cần trông giống nhau trên tất cả các thiết bị có> = API14 khi nói đến tùy chỉnh thanh hành động và thanh trạng thái. Cuối cùng thì tôi cũng đã tìm ra giải pháp và vì mất một chút thời gian nên tôi sẽ chia sẻ nó để cứu một số giải pháp của bạn. Chúng tôi bắt đầu bằng cách sử dụng phụ thuộc appcompat-21.

Thanh hành động trong suốt :

giá trị / styles.xml :

<style name="AppTheme" parent="Theme.AppCompat.Light">
...
</style>

<style name="AppTheme.ActionBar.Transparent" parent="AppTheme">
    <item name="android:windowContentOverlay">@null</item>
    <item name="windowActionBarOverlay">true</item>
    <item name="colorPrimary">@android:color/transparent</item>
</style>

<style name="AppTheme.ActionBar" parent="AppTheme">
    <item name="windowActionBarOverlay">false</item>
    <item name="colorPrimary">@color/default_yellow</item>
</style>


giá trị-v21 / styles.xml :

<style name="AppTheme" parent="Theme.AppCompat.Light">
    ...
</style>

<style name="AppTheme.ActionBar.Transparent" parent="AppTheme">
    <item name="colorPrimary">@android:color/transparent</item>
</style>

<style name="AppTheme.ActionBar" parent="AppTheme">
    <item name="colorPrimaryDark">@color/bg_colorPrimaryDark</item>
    <item name="colorPrimary">@color/default_yellow</item>
</style>

Giờ đây, bạn có thể sử dụng các chủ đề này trong của mình AndroidManifest.xmlđể chỉ định hoạt động nào sẽ có màu trong suốt hoặc màu ActionBar:

    <activity
            android:name=".MyTransparentActionbarActivity"
            android:theme="@style/AppTheme.ActionBar.Transparent"/>

    <activity
            android:name=".MyColoredActionbarActivity"
            android:theme="@style/AppTheme.ActionBar"/>

nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây

Lưu ý: trong API> = 21 để có được độ Actionbartrong suốt, bạn cũng cần phải có được độ Statusbartrong suốt, nếu không sẽ không tôn trọng kiểu màu của bạn và sẽ có màu xám nhạt.



Thanh trạng thái trong suốt (chỉ hoạt động với API> = 19) : Thanh
này khá đơn giản chỉ cần sử dụng mã sau:

protected void setStatusBarTranslucent(boolean makeTranslucent) {
        if (makeTranslucent) {
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        } else {
            getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        }
    }

Nhưng bạn sẽ nhận thấy một kết quả thú vị: nhập mô tả hình ảnh ở đây

Điều này xảy ra vì khi Statusbarbố cục trong suốt, bố cục sẽ sử dụng chiều cao của nó. Để ngăn chặn điều này, chúng ta chỉ cần:

GIẢI PHÁP MỘT:
Thêm dòng này android:fitsSystemWindows="true"vào vùng chứa chế độ xem bố cục của bạn về bất kỳ thứ gì bạn muốn đặt bên dưới Thanh tác vụ:

    ...
        <LinearLayout
                android:fitsSystemWindows="true"
                android:layout_width="match_parent"
                android:layout_height="match_parent">
            ...
        </LinearLayout>
    ...

GIẢI PHÁP HAI:
Thêm một vài dòng vào phương pháp trước của chúng tôi:

protected void setStatusBarTranslucent(boolean makeTranslucent) {
        View v = findViewById(R.id.bellow_actionbar);
        if (v != null) {
            int paddingTop = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT ? MyScreenUtils.getStatusBarHeight(this) : 0;
            TypedValue tv = new TypedValue();
            getTheme().resolveAttribute(android.support.v7.appcompat.R.attr.actionBarSize, tv, true);
            paddingTop += TypedValue.complexToDimensionPixelSize(tv.data, getResources().getDisplayMetrics());
            v.setPadding(0, makeTranslucent ? paddingTop : 0, 0, 0);
        }

        if (makeTranslucent) {
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        } else {
            getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        }
    }

Nơi R.id.bellow_actionbarsẽ là id chế độ xem vùng chứa bố cục của bất kỳ thứ gì chúng ta muốn được đặt bên dưới Actionbar:

...
    <LinearLayout
            android:id="@+id/bellow_actionbar"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
        ...
    </LinearLayout>
...

nhập mô tả hình ảnh ở đây

Vì vậy, đây là nó, nó nghĩ rằng tôi không quên một cái gì đó. Trong ví dụ này, tôi không sử dụng a Toolbarnhưng tôi nghĩ nó sẽ có kết quả tương tự. Đây là cách tôi tùy chỉnh Actionbar:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        View vg = getActionBarView();
        getWindow().requestFeature(vg != null ? Window.FEATURE_ACTION_BAR : Window.FEATURE_NO_TITLE);

        super.onCreate(savedInstanceState);
        setContentView(getContentView());

        if (vg != null) {
            getSupportActionBar().setCustomView(vg, new ActionBar.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
            getSupportActionBar().setDisplayShowCustomEnabled(true);
            getSupportActionBar().setDisplayShowHomeEnabled(false);
            getSupportActionBar().setDisplayShowTitleEnabled(false);
            getSupportActionBar().setDisplayUseLogoEnabled(false);
        }
        setStatusBarTranslucent(true);
    }

Lưu ý: đây là một abstract classmở rộng ActionBarActivity
Hy vọng nó sẽ giúp!


9
Bạn thực sự nên sử dụng android: fitSystemWindows nếu bạn muốn đảm bảo Chế độ xem của mình không nằm bên dưới thanh trạng thái trong suốt.
ianhanniballake

1
Điều đó hoàn toàn chính xác, tôi đang xem lại mã của mình và tôi cũng đang sử dụng mã này. Không biết tôi đã bỏ lỡ nó trong ví dụ này. Tôi sẽ cập nhật nó, cảm ơn!
GuilhE

4
Bạn đang thiếu MyScreenUtils.getStatusBarHeight(this) ở đây là câu trả lời stackoverflow.com/a/3410200/1307690
Roman Nazarevych

1
có cách nào để làm cho nó mờ và không hoàn toàn trong suốt không? Tôi đang ở trên 23 api
aks.

6
Để có được trong suốt statusbar trình tôi cần phải thêm FLAG_LAYOUT_NO_LIMITS Flag, đưa mã getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);sau đógetWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
Eduardo ER

3

Nó hỗ trợ sau KITKAT. Chỉ cần thêm mã sau vào bên trong phương thức onCreate của Hoạt động của bạn. Không cần bất kỳ sửa đổi nào đối với tệp kê khai.

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                Window w = getWindow(); // in Activity's onCreate() for instance
                w.setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
            }

9
Điều này làm cho thanh điều hướng cũng trong suốt
NOlivNeto

0

Chỉ cần thêm các dòng mã này vào tệp java hoạt động / phân đoạn của bạn:

getWindow().setFlags(
    WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
    WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
);
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.