Bilah status dan bilah tindakan transparan Android

97

Saya telah melakukan beberapa penelitian tentang topik ini dan saya tidak dapat menemukan solusi lengkap jadi, langkah demi langkah dan dengan beberapa trial and error, saya akhirnya menemukan bagaimana kita dapat mencapai hasil ini: memiliki transparan atau berwarna Actionbardan Statusbar. Lihat jawabanku di bawah.

GuilhE
sumber

Jawaban:

238

Saya mengembangkan aplikasi yang perlu terlihat serupa di semua perangkat dengan> = API14 dalam hal kustomisasi bilah tindakan dan statusbar. Saya akhirnya menemukan solusi dan karena butuh sedikit waktu saya, saya akan membagikannya untuk menyelamatkan beberapa solusi Anda. Kami mulai dengan menggunakan dependensi appcompat-21.

Bilah Tindakan Transparan :

values ​​/ 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>


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

Sekarang Anda dapat menggunakan tema-tema ini AndroidManifest.xmluntuk menentukan aktivitas mana yang akan memiliki transparan atau berwarna ActionBar:

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

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

masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

Catatan: dalam API> = 21 untuk mendapatkan Actionbartransparan Anda perlu mendapatkan Statusbartransparan juga, jika tidak tidak akan menghormati gaya warna Anda dan akan tetap abu-abu terang.



Transparent Statusbar (hanya berfungsi dengan API> = 19) :
Yang ini cukup sederhana, cukup gunakan kode berikut:

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

Tetapi Anda akan melihat hasil yang funky: masukkan deskripsi gambar di sini

Ini terjadi karena jika Statusbartransparan, tata letak akan menggunakan tingginya. Untuk mencegahnya, kita hanya perlu:

SOLUSI SATU:
Tambahkan baris ini android:fitsSystemWindows="true"di wadah tampilan tata letak apa pun yang ingin Anda tempatkan di bawah Bilah Tindakan:

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

SOLUSI DUA:
Tambahkan beberapa baris ke metode sebelumnya:

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

Di mana R.id.bellow_actionbarakan menjadi id tampilan wadah tata letak apa pun yang ingin kita tempatkan di bawah Actionbar:

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

masukkan deskripsi gambar di sini

Jadi ini dia, saya pikir saya tidak melupakan sesuatu. Dalam contoh ini saya tidak menggunakan a Toolbartetapi saya pikir itu akan memiliki hasil yang sama. Beginilah cara saya menyesuaikan 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);
    }

Catatan: ini adalah abstract classyang meluas. ActionBarActivity
Semoga membantu!

GuilhE
sumber
9
Anda harus benar-benar menggunakan android: fitSystemWindows jika ingin memastikan Tampilan Anda tidak berada di bawah bilah status transparan.
ianhanniballake
1
Itu benar sekali, saya sedang meninjau kode saya dan saya juga menggunakan ini. Tidak tahu saya melewatkannya dalam contoh ini. Saya akan memperbaruinya, terima kasih!
GuilhE
4
Anda hilang di MyScreenUtils.getStatusBarHeight(this) sini adalah jawaban stackoverflow.com/a/3410200/1307690
Roman Nazarevych
1
apakah ada cara untuk membuatnya transparan dan tidak sepenuhnya transparan? Saya berada di api 23
aks
6
Untuk mendapatkan Transparent StatusBar Works saya perlu menambahkan FLAG_LAYOUT_NO_LIMITS Flag, meletakkan kode getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);setelah itugetWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
Eduardo ER
3

Ini mendukung setelah KITKAT. Cukup tambahkan kode berikut di dalam metode onCreate dari Aktivitas Anda. Tidak perlu modifikasi apa pun pada file Manifest.

 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);
            }
Indika Ruwan Senavirathne
sumber
9
Ini membuat bilah navigasi juga transparan
NOlivNeto
0

Cukup tambahkan baris kode berikut ke file java aktivitas / fragmen Anda:

getWindow().setFlags(
    WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
    WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
);
Faisal Shaikh
sumber