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"/>
Lưu ý: trong API> = 21 để có được độ Actionbar
trong suốt, bạn cũng cần phải có được độ Statusbar
trong 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ị:
Điều này xảy ra vì khi Statusbar
bố 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_actionbar
sẽ 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>
...
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 Toolbar
như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 class
mở rộng ActionBarActivity
Hy vọng nó sẽ giúp!