Yeni Material Component kitaplığıyla , stilinizdeki niteliği kullanarak bileşeninizin şeklini özelleştirebilirsinizshapeAppearanceOverlay
( Not: 1.1.0 sürümünü gerektirir )
Sadece yöntemi BottomSheetDialogFragment
geçersiz kılın onCreateView
ve ardından Alt Sayfa İletişim Kutuları için özel stilinizi tanımlayın.
bottomSheetDialogTheme
Özniteliği styles.xml
uygulama temanızda tanımlayın :
<style name="AppTheme" parent="Theme.MaterialComponents.Light">
<item name="colorPrimary">@color/colorPrimary</item>
....
<item name="bottomSheetDialogTheme">@style/CustomBottomSheetDialog</item>
</style>
Ardından en sevdiğiniz şekli tanımlayın shapeAppearanceOverlay
<style name="CustomBottomSheetDialog" parent="@style/ThemeOverlay.MaterialComponents.BottomSheetDialog">
<item name="bottomSheetStyle">@style/CustomBottomSheet</item>
</style>
<style name="CustomBottomSheet" parent="Widget.MaterialComponents.BottomSheet">
<item name="shapeAppearanceOverlay">@style/CustomShapeAppearanceBottomSheetDialog</item>
</style>
<style name="CustomShapeAppearanceBottomSheetDialog" parent="">
<item name="cornerFamily">rounded</item>
<item name="cornerSizeTopRight">16dp</item>
<item name="cornerSizeTopLeft">16dp</item>
<item name="cornerSizeBottomRight">0dp</item>
<item name="cornerSizeBottomLeft">0dp</item>
</style>
Bu yöntemi geçersiz kılarak aynı davranışı BottomSheetDialogFragment
( bottomSheetDialogTheme
uygulamanızın temasına eklemek yerine ):
@Override public int getTheme() {
return R.style.CustomBottomSheetDialog;
}
Bu durumda, bu themeOverlay'i yalnızca tekli olarak kullanıyorsunuz BottomSheetDialogFragment
, tüm uygulamalarda kullanmıyorsunuz .
GENİŞLETİLMİŞ DEVLET hakkında önemli not :
Genişletilmiş durumda Alt Sayfanın düz köşeleri vardır . Resmi yorumu github deposunda kontrol edebilirsiniz :
Tasarım ekibimiz, yuvarlatılmış köşelerin kaydırılabilir içeriği, düz köşelerin ise ek içerik olmadığını gösterdiğini düşünüyor. Bu nedenle, bu değişikliği fitToContents ile eklememizi istemiyorlar.
Bu davranış, tarafından sağlanır BottomSheetBehavior
ve geçersiz kılınması imkansızdır.
Ancak bir çözüm var -> SORUMLULUK REDDİ: sonraki sürümlerde çalışmayı durdurabilir !!
Bir ekleyebilir BottomSheetCallback
içinde BottomSheetDialogFragment
:
@NonNull @Override public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
Dialog dialog = super.onCreateDialog(savedInstanceState);
((BottomSheetDialog)dialog).getBehavior().addBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
@Override public void onStateChanged(@NonNull View bottomSheet, int newState) {
if (newState == BottomSheetBehavior.STATE_EXPANDED) {
MaterialShapeDrawable newMaterialShapeDrawable = createMaterialShapeDrawable(bottomSheet);
ViewCompat.setBackground(bottomSheet, newMaterialShapeDrawable);
}
}
@Override public void onSlide(@NonNull View bottomSheet, float slideOffset) {
}
});
return dialog;
}
@NotNull private MaterialShapeDrawable createMaterialShapeDrawable(@NonNull View bottomSheet) {
ShapeAppearanceModel shapeAppearanceModel =
ShapeAppearanceModel.builder(getContext(), 0, R.style.CustomShapeAppearanceBottomSheetDialog)
.build();
MaterialShapeDrawable currentMaterialShapeDrawable = (MaterialShapeDrawable) bottomSheet.getBackground();
MaterialShapeDrawable newMaterialShapeDrawable = new MaterialShapeDrawable((shapeAppearanceModel));
newMaterialShapeDrawable.initializeElevationOverlay(getContext());
newMaterialShapeDrawable.setFillColor(currentMaterialShapeDrawable.getFillColor());
newMaterialShapeDrawable.setTintList(currentMaterialShapeDrawable.getTintList());
newMaterialShapeDrawable.setElevation(currentMaterialShapeDrawable.getElevation());
newMaterialShapeDrawable.setStrokeWidth(currentMaterialShapeDrawable.getStrokeWidth());
newMaterialShapeDrawable.setStrokeColor(currentMaterialShapeDrawable.getStrokeColor());
return newMaterialShapeDrawable;
}