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.xml
untuk 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"/>
Catatan: dalam API> = 21 untuk mendapatkan Actionbar
transparan Anda perlu mendapatkan Statusbar
transparan 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:
Ini terjadi karena jika Statusbar
transparan, 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_actionbar
akan 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>
...
Jadi ini dia, saya pikir saya tidak melupakan sesuatu. Dalam contoh ini saya tidak menggunakan a Toolbar
tetapi 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 class
yang meluas. ActionBarActivity
Semoga membantu!
MyScreenUtils.getStatusBarHeight(this)
sini adalah jawaban stackoverflow.com/a/3410200/1307690FLAG_LAYOUT_NO_LIMITS
Flag, meletakkan kodegetWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
setelah itugetWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
Ini mendukung setelah KITKAT. Cukup tambahkan kode berikut di dalam metode onCreate dari Aktivitas Anda. Tidak perlu modifikasi apa pun pada file Manifest.
sumber
Cukup tambahkan baris kode berikut ke file java aktivitas / fragmen Anda:
sumber