नई सामग्री घटक लाइब्रेरी के साथ आप अपनी शैली में विशेषता का उपयोग करके अपने घटक के आकार को अनुकूलित कर सकते shapeAppearanceOverlay
हैं ( ध्यान दें: इसके लिए संस्करण 1.1.0 की आवश्यकता है )
बस BottomSheetDialogFragment
ओवरराइडिंग onCreateView
विधि का उपयोग करें और फिर नीचे शीट संवाद के लिए अपनी कस्टम शैली को परिभाषित करें।
अपनी एप्लिकेशन थीम में bottomSheetDialogTheme
विशेषता को परिभाषित करें styles.xml
:
<style name="AppTheme" parent="Theme.MaterialComponents.Light">
<item name="colorPrimary">@color/colorPrimary</item>
....
<item name="bottomSheetDialogTheme">@style/CustomBottomSheetDialog</item>
</style>
फिर बस अपने पसंदीदा आकार को परिभाषित करें 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>
आप इस पद्धति को अपने BottomSheetDialogFragment
( bottomSheetDialogTheme
अपने ऐप थीम में जोड़ने के बजाय) इस पद्धति को ओवरराइड करने का व्यवहार प्राप्त कर सकते हैं :
@Override public int getTheme() {
return R.style.CustomBottomSheetDialog;
}
इस स्थिति में आप इस थीम को केवल एकल में उपयोग कर रहे हैं BottomSheetDialogFragment
और सभी ऐप में नहीं।
आवश्यक स्टेट के बारे में महत्वपूर्ण सूचना :
विस्तारित अवस्था में बॉटमशीट में सपाट कोने हैं । आप आधिकारिक टिप्पणी github रेपो में देख सकते हैं :
हमारी डिजाइन टीम ने दृढ़ता से माना है कि गोल कोनों को स्क्रॉल करने योग्य सामग्री का संकेत मिलता है जबकि फ्लैट कोनों से संकेत मिलता है कि कोई अतिरिक्त सामग्री नहीं है। जैसे, वे नहीं चाहते कि हम इस बदलाव को fitToContents के साथ जोड़ें।
यह व्यवहार द्वारा प्रदान किया गया है BottomSheetBehavior
और इसे ओवरराइड करना असंभव है।
हालाँकि एक वर्कअराउंड है -> अस्वीकरण: यह अगले रिलीज में काम करना बंद कर सकता है !!
आप एक जोड़ सकते हैं BottomSheetCallback
में 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;
}