बॉटम कोने के लिए बॉटमशीटडायलॉगफ्रेममेंट


111

मेरे पास एक कस्टम BttomSheetDialogFragment है और मैं बॉटम व्यू के ऊपर गोल कोनों रखना चाहता हूं

यह मेरा कस्टम वर्ग है जो मेरे लेआउट को फुलाता है जिसे मैं नीचे से दिखाना चाहता हूं

View mView;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    mView = inflater.inflate(R.layout.charge_layout, container, false);
    initChargeLayoutViews();
    return mView;
}

और मैं भी पृष्ठभूमि के रूप में इस xml संसाधन फ़ाइल है:

<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle"
>
<corners android:topRightRadius="35dp"
    android:topLeftRadius="35dp"
    />
<solid android:color="@color/white"/>

<padding android:top="10dp"
    android:bottom="10dp"
    android:right="16dp"
    android:left="16dp"/>

लेकिन समस्या यह है, जब मैंने इस संसाधन फ़ाइल को अपने लेआउट के मूल तत्व की पृष्ठभूमि के रूप में सेट किया है, तो कोने अभी भी गोल नहीं हैं

और मैं नीचे दिए गए कोड का उपयोग नहीं कर सकता:

    this.getDialog().getWindow().setBackgroundDrawableResource(R.drawable.charge_layout_background);

बॉटमशीटडायलॉग की अपनी ओवरराइड डिफॉल्ट बैकग्राउंड को cuz करें और मेरे बॉटम व्यू के ऊपर कोई भी सेमी-ट्रांसपेरेंट ग्रे कलर न हो


5
@RasoolGhana - इस लिंक पर एक नज़र डालें: medium.com/halcyon-mobile/…
मोहित चरणवा

जवाबों:


229

एक कस्टम ड्राएबल बनाएँ rounded_dialog.xml:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <solid android:color="@android:color/white"/>
    <corners android:topLeftRadius="16dp"
        android:topRightRadius="16dp"/>

</shape>

फिर ड्रॉबल को पृष्ठभूमि के रूप में उपयोग करने bottomSheetDialogThemeपर ओवरराइड करें styles.xml:

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">       
    <item name="bottomSheetDialogTheme">@style/AppBottomSheetDialogTheme</item>
</style>

<style name="AppBottomSheetDialogTheme"
    parent="Theme.Design.Light.BottomSheetDialog">
    <item name="bottomSheetStyle">@style/AppModalStyle</item>
</style>

<style name="AppModalStyle"
    parent="Widget.Design.BottomSheet.Modal">
    <item name="android:background">@drawable/rounded_dialog</item>
</style>

यह आपके ऐप के सभी बॉटमशीटडायलॉग्स को बदल देगा।


2
इससे मेरा काम बनता है। इसके अलावा, मैंने देखा कि यह लेआउट रूट तत्व पर निर्भर करता है। सबसे पहले मेरे पास कार्डव्यू रूट के रूप में था (क्योंकि मैंने कोनों को गोल करने के लिए एक और तरीका आज़माया), फिर मैंने इसे रैखिक लेआउट में बदल दिया और अब यह पूरी तरह से काम करता है
इवान शफरान

1
एंड्रॉइड
एप

1
मैं प्रयोग नहीं करेंगे rounded_dialogऔर AppModalStyleएक पृष्ठभूमि जहां केवल शीर्ष कोनों गोल कर रहे हैं के साथ नाम, जैसा कि आप केवल एक नीचे चादर शैली के साथ इस तरह के एक पृष्ठभूमि का उपयोग करने की उम्मीद होगी। कैसे bottomsheet_rounded_backgroundऔरAppBottomSheetStyle
hmac

3
ध्यान दें यदि आप मूल दृश्य पर एक पृष्ठभूमि निर्दिष्ट करते हैं तो यह इस सेटिंग को ओवरराइड करेगा
hmac

2
सुनिश्चित करें कि आपकी शीट लेआउट के मूल तत्व पर आपकी कोई पृष्ठभूमि नहीं है!
एमएमके

81

नई सामग्री घटक लाइब्रेरी के साथ आप अपनी शैली में विशेषता का उपयोग करके अपने घटक के आकार को अनुकूलित कर सकते shapeAppearanceOverlayहैं ( ध्यान दें: इसके लिए संस्करण 1.1.0 की आवश्यकता है )

बस BottomSheetDialogFragmentओवरराइडिंग onCreateViewविधि का उपयोग करें और फिर नीचे शीट संवाद के लिए अपनी कस्टम शैली को परिभाषित करें।

अपनी एप्लिकेशन थीम में bottomSheetDialogThemeविशेषता को परिभाषित करें styles.xml:

  <!-- Base application theme. -->
  <style name="AppTheme" parent="Theme.MaterialComponents.Light">
    <!-- Customize your theme here. -->
    <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) {
          //In the EXPANDED STATE apply a new MaterialShapeDrawable with rounded cornes
          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 =

      //Create a ShapeAppearanceModel with the same shapeAppearanceOverlay used in the style
      ShapeAppearanceModel.builder(getContext(), 0, R.style.CustomShapeAppearanceBottomSheetDialog)
        .build();

      //Create a new MaterialShapeDrawable (you can't use the original MaterialShapeDrawable in the BottoSheet)
      MaterialShapeDrawable currentMaterialShapeDrawable = (MaterialShapeDrawable) bottomSheet.getBackground();
      MaterialShapeDrawable newMaterialShapeDrawable = new MaterialShapeDrawable((shapeAppearanceModel));
      //Copy the attributes in the new MaterialShapeDrawable
      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;
  }

2
इस तकनीक का उपयोग कर @GabrieleMariotti, अगर मैं शीट पर कहीं टैप करता हूं और इसे खारिज नहीं किया जाता है, तो कोनों को चेतन कर दिया जाता है। मुझे यकीन नहीं है कि आप एंड्रॉइड सामग्री घटकों पर विकसित होते हैं, लेकिन यदि आप हैं, तो क्या आप इस मुद्दे के बारे में जानते हैं? मैं 1.1.0-अल्फा 10 का उपयोग कर रहा था, लेकिन मैंने अभी बीटा 2 की भी जांच की। मुझे यकीन नहीं है कि यह मेरे द्वारा शीट में डाले गए सटीक विचारों पर निर्भर करता है या नहीं।
androidguy

1
मैंने इस मुद्दे की सूचना दी है: जारीकर्ता क्र.सं.सु। / 144859239 यदि किसी के पास इस मुद्दे के लिए कोई और निष्कर्ष या समाधान है, तो कृपया उत्तर दें। धन्यवाद!
androidguy

4
मुझे यह त्रुटि और v1.1.0-beta02 पर दुर्घटना हो रही हैCould not inflate Behavior subclass com.google.android.material.bottomsheet.BottomSheetBehavior
hkchakladar

3
अगर नीचे शीट संवाद का विस्तार किया जाता है तो यह काम नहीं करता है। कोई उपाय?
जोस कार्लोस

4
यह एकदम सही और नवीनतम उत्तर था। मुझे इसके उत्तर के रूप में चिह्नित करने की आवश्यकता है
विकास आचार्य

38

BottomSheetDialogएक डिफ़ॉल्ट सफेद पृष्ठभूमि रंग स्थापित कर रही है, यही कारण है कि कोनों दिखाई नहीं देते हैं, ताकि उन्हें दिखाने के लिए आप की शैली अधिभावी द्वारा संवाद पारदर्शी की पृष्ठभूमि बनाने की जरूरत में BottomSheetDialog

इस शैली को अपने में परिभाषित करें res/values/styles/styles.xml

<style name="BottomSheetDialog" parent="Theme.Design.Light.BottomSheetDialog">
    <item name="bottomSheetStyle">@style/bottomSheetStyleWrapper</item>
</style>

<style name="bottomSheetStyleWrapper" parent="Widget.Design.BottomSheet.Modal">
    <item name="android:background">@android:color/transparent</item>
</style>

और इस शैली को अपने बॉटमशीटडायलॉग पर सेट करें

View view = getLayoutInflater().inflate(R.layout.chooser_bottom_sheet, null);
BottomSheetDialog dialog = new BottomSheetDialog(this,R.style.BottomSheetDialog); // Style here
dialog.setContentView(view);
dialog.show();

2
स्वीकार किए गए उत्तर से बेहतर है, क्योंकि इस तरह से आप विभिन्न बॉटमशीटडायलॉग्स पर अलग पृष्ठभूमि पा सकते हैं
ल्यूक

अब वक्र दिखाई दे रहा है, लेकिन स्क्रीन पर पूरे पारदर्शी रंग केवल नीचे डायल पर सफेद रंग दिखाई दे रहा है।
अर्नोल्ड ब्राउन

यहां काम किया। धन्यवाद!
मिशेल फर्नांडिस

यही वह समाधान है जिसकी मुझे तलाश थी, पूरी तरह से हैक मुक्त।
प्रतीक गुप्ता

26

rounded_corners_shape नाम की एक आकृति बनाएं

<shape xmlns:android="http://schemas.android.com/apk/res/android"
       android:shape="rectangle">
    <corners
        android:topLeftRadius="8dp"
        android:topRightRadius="8dp"/>
    <solid android:color="@color/white"/>

</shape>

एक शैली को परिभाषित करें

  <style name="AppBottomSheetDialogTheme"
           parent="Theme.Design.Light.BottomSheetDialog">
        <item name="bottomSheetStyle">@style/AppModalStyle</item>
    </style>

    <style name="AppModalStyle" parent="Widget.Design.BottomSheet.Modal">
        <item name="android:background">@drawable/rounded_corners_shape</item>
    </style>

इस शैली को अपने कस्टम बॉटमशीटडायलॉगफ्रेम पर इस तरह से उपयोग करें, यह काम करेगा!

 public class CustomDialogFragment extends BottomSheetDialogFragment {
      @Override
      public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setStyle(STYLE_NORMAL, R.style. AppBottomSheetDialogTheme);
      }

      ...
    }

यदि आप कोड के साथ कुछ स्पष्टीकरण जोड़ते हैं तो यह उपयोगी होगा।
उदित्स

यह Fragments के लिए थीम सेट करने के लिए सही जगह है ।
DYS

10

यदि आप भौतिक घटक के अंतिम संस्करण का उपयोग करते हैं तो आपको बस ओवरराइड करना होगा ShapeAppearance.MaterialComponents.LargeComponent(जैसा कि नीचे की शीट इस आकृति का उपयोग करती है) और वह मान सेट करें जो आप चाहते हैं:

 <style name="ShapeAppearance.YourApp.LargeComponent" parent="ShapeAppearance.MaterialComponents.LargeComponent">
        <item name="cornerFamily">rounded</item>
        <item name="cornerSize">12dp</item>
 </style>

और फिर अपनी एप्लिकेशन शैली में सेट करें:

<item name="shapeAppearanceLargeComponent">@style/ShapeAppearance.YourApp.LargeComponent</item>

गैब्रिएल मैरीओटी का समाधान समान है और काम भी करता है लेकिन यह सरल है।


अन्य की तुलना में यह एक बेहतर समाधान है, क्योंकि अधिकांश समाधान सेट कस्टम
ड्रॉबल

1
अच्छा लगता है। क्या यह भी लागू होता है BottomSheetDialog?
जेडन गु

1
सभी पर ध्यान दें: इस उत्तर का उपयोग ShapeAppearance.MaterialComponents.LargeComponentकरने से सभी घटक एक ही कोने का उपयोग करेंगे और परिवार होगा, न कि केवल नीचे की शीट। अपनी शैली की आवश्यकता जांचें और तय करें कि क्या आप सभी घटक या केवल व्यक्तिगत घटक या विजेट के लिए उपस्थिति बदलना चाहते हैं।
नितिनकुमार

8

मैं आज उसी चीज़ की जाँच कर रहा था और हाँ आप कोड का पालन करने के बारे में सही थे

this.getDialog().getWindow().setBackgroundDrawableResource(R.drawable.charge_layout_background);

यह खंडित पृष्ठभूमि पर लागू होता है, इसलिए आपको संवाद विंडो से बॉटमशीट दृश्य प्राप्त करना चाहिए और यहां पृष्ठभूमि को बदलना कोड है

 @SuppressLint("RestrictedApi")
    @Override
    public void setupDialog(Dialog dialog, int style) {
        super.setupDialog(dialog, style);
        View rootView = getActivity().getLayoutInflater().inflate(R.layout.view_member_info,null,false);
        unbinder = ButterKnife.bind(this, rootView);
        adjustUIComponents();
        dialog.setContentView(rootView);
        FrameLayout bottomSheet = (FrameLayout) dialog.getWindow().findViewById(android.support.design.R.id.design_bottom_sheet);
        bottomSheet.setBackgroundResource(R.drawable.container_background);
    }

यहां बॉटमशीट वह वास्तविक दृश्य है जिसे आप बदलना चाहते हैं।


एकमात्र तरीका मुझे यह काम मिला। Btw मैं का उपयोग कर रहा हूँ BottomSheetDialogFragmentताकि तर्क onCreateDialogविधि में है
Kirill Starostin

8

द्वारा उत्तर Koma यिप से एक और सवाल मेरे लिए काम किया है, आप इसे कोशिश करनी चाहिए।

ड्रा करने योग्य में एक xml बनाएं, डायलॉग_bg.xml बोलें

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="@color/white"/>
    <corners android:radius="30dp" />
    <padding
        android:left="10dp"
        android:top="10dp"
        android:right="10dp"
        android:bottom="10dp" />
</shape>

इसे अपने लेआउट xml रूट नोड में डालें:

इसे अपने लेआउट xml में पृष्ठभूमि के रूप में सेट करें

android:background="@drawable/dialog_bg"

और onCreateView()इसे डालें:

पारदर्शी करने के लिए अपने संवाद की पृष्ठभूमि सेट करें

dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));

यह सही समाधान होना चाहिए क्योंकि यह हुप्स के माध्यम से कूद के बिना सभी DialogFragments के लिए काम करता है।
jssingh

3
मेरे लिए, मेरे गोल कोनों के पीछे अभी भी सफेद कोने हैं। इसलिए जब मैं अपने ड्रा करने योग्य रंग को लाल रंग में बदलता हूं, तो आपका कोड सही ढंग से काम करता है और एक गोल लाल आयत बनाता है, लेकिन इसके पीछे अभी भी एक डिफ़ॉल्ट सफेद आयत है। "Dialog.getWindow ()। SetBackgroundDrawable ..." कोड आप परिवर्तनों को लिखा था पूरे "अंधेरे" मेरे संवाद ऊपर क्षेत्र का रंग है, लेकिन फिर से, यह उन दो छोटे कोनों याद करते हैं। क्या आप जानते हैं कि इस मुद्दे का क्या कारण हो सकता है?
निक देव

ऊपर मेरी टिप्पणी करने पर जोड़ा जा रहा है, मैं नोट करना चाहिए कि मैं में कोड बदलना पड़ा ) onCreateView ( करने के लिए " getDialog () .getWindow () ..." क्रम में रन करने के लिए अपने कोड के लिए। शायद यही कारण है कि यह मेरे लिए काम नहीं करता है।
निक देव

1
@NickDev नया प्रश्न पोस्ट करें यदि आपको लगता है कि यह समाधान आपके कोड पर लागू नहीं होता है और शायद हम इसका समाधान ढूंढ लेंगे।
वैराग

@ वारिग बाहर तक पहुँचने के लिए धन्यवाद; मैं वास्तव में एक सस्ते वर्कअराउंड के साथ आया था जहां मैं एक आयत के साथ डिफॉल्ट बॉटम शीट मोडल डायलॉग को कवर करता हूं जो कि पीछे के अंधेरे क्षेत्र के समान रंग है। फिर मैंने उसके ऊपर गोल कोनों के साथ एक दूसरी आयत जोड़ी। यह आदर्श नहीं है, लेकिन यह बहुत अच्छा लग रहा है! मैं फिर भी मदद की सराहना करता हूं।
निक देव

6
  1. एक आकृति बनाने योग्य बनाएं .. जिसे हम नीचे की शीट के लिए पृष्ठभूमि के रूप में उपयोग करेंगे। शीर्ष बाएँ और दाएँ कोने के त्रिज्या के लिए उचित मूल्य प्रदान करें।

    <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="rectangle">
        <corners
            android:topLeftRadius="24dp"
            android:topRightRadius="24dp" />
        <padding android:top="2dp" />
        <solid android:color="@color/white" />
    </shape>
    
  2. अब "नीचे शीट संवाद टुकड़ा" के लिए शैली बनाएं

    <style name="BottomSheet" parent="@style/Widget.Design.BottomSheet.Modal">
            <item name="android:background">@drawable/drawable_bottomsheet_background</item>
        </style>
    
        <style name="BaseBottomSheetDialog" parent="@style/Theme.Design.Light.BottomSheetDialog">
            <item name="android:windowIsFloating">false</item>
            <item name="bottomSheetStyle">@style/BottomSheet</item>
        </style>
    
        <style name="BottomSheetDialogTheme" parent="BaseBottomSheetDialog" />
    
  3. अब एक कस्टम वर्ग बनाएं जो बॉटमशीटडिलॉगफ्रैगमेंट का विस्तार करेगा, जहां आप अपनी शैली प्रदान करते हैं।

    open class CustomRoundBottomSheet : BottomSheetDialogFragment() {
    
        override fun getTheme(): Int = R.style.BottomSheetDialogTheme
    
        override fun onCreateDialog(savedInstanceState: Bundle?): Dialog = BottomSheetDialog(requireContext(), theme)
    
    }
    
  4. अब आप जहाँ भी गोल कोने वाली नीचे की चादर चाहते हैं, इस वर्ग का उपयोग करें। जैसे

    class BottomSheetSuccess : CustomRoundBottomSheet() {
    
        override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
            return inflater.inflate(R.layout.bottomsheet_shopcreate_success, container, false)
        }
    
    
        override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
            super.onViewCreated(view, savedInstanceState)
        }
    
    } 
    

5

इसने मेरे लिए काम किया

एक आकृति बनाएं जिसका नाम shape_rounded_dialog है

<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/color_white" />
<corners
    android:topLeftRadius="16dp"
    android:topRightRadius="16dp" />

शैलियों के नीचे जोड़ें

<style name="AppBottomSheetDialogTheme" parent="Theme.MaterialComponents.Light.BottomSheetDialog">
    <item name="bottomSheetStyle">@style/CustomBottomSheetStyle</item>
</style>

<style name="CustomBottomSheetStyle" parent="Widget.Design.BottomSheet.Modal">
    <item name="android:background">@drawable/shape_rounded_dialog</item>
</style>

क्लास डायलॉगफ्रैगमेंट में, मेथड ओवरराइड गेटटैमे भी योरसेल्फ स्टाइल लौटाता है।

@Override
public int getTheme() {
    return R.style.AppBottomSheetDialogTheme;
}

4

यह उत्तर केवल पृष्ठभूमि के रंग को सेट करने के मुद्दे के लिए है Color.TRANSPARENT लेआउट में गोल पृष्ठभूमि के साथ एक ड्रॉबल स्थापित बाद लिए है।

Color.TRANSPARENTओवरराइडिंग setupDialog()समाधान को छोड़कर पृष्ठभूमि रंग सेट करने के लिए मेरे जवाब में से किसी ने भी काम नहीं किया :

@Override
public void setupDialog(Dialog dialog, int style) {
    super.setupDialog(dialog, style);
    View contentView = View.inflate(getContext(), 
R.layout.fragment_bottom_sheet, null);
    dialog.setContentView(contentView);
    ...
    ((View) contentView.getParent()).setBackgroundColor(ContextCompat.getColor(getContext(), android.R.color.transparent));
}

लेकिनcontentView आप संवाद के लिए जो सेट करते हैं, वह यहाँ नहीं viewहै onViewCreated()जब आपको फुलाया जाता है onCreateView()। यह मानक प्रवाह को तोड़ता है, इसलिए परेशानी जारी कर सकता है जैसे आप उपयोग नहीं कर सकते हैं View Bindings-Kotlin Android Extensions मेंonViewCreated()

इसलिए मैं पृष्ठभूमि को सेट करने के लिए थोड़ा ट्विक करता हूं onActivityCreated():

override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)
    (view?.parent as View).setBackgroundColor(Color.TRANSPARENT)
  }

उम्मीद है कि इस मदद से जो एक ही मुसीबत हो गई


2

मुझे पता है कि इस सवाल का पहले से ही एक स्वीकृत जवाब है। मैं उन समस्याओं का दस्तावेजीकरण करना चाहता हूँ, जिनसे मैं गुजरा था और मैंने इसे आखिरकार कैसे काम किया, इसलिए यह भविष्य में किसी के लिए उपयोगी है।

सबसे पहले, मैं Theme.AppCompat.Light.DarkActionBarहमारे लिए माता-पिता के रूप में उपयोग कर रहा था AppTheme। इसका मतलब था @ गैरीबेल मैरीओटी समाधान त्रुटि के साथ दुर्घटनाग्रस्त रहा Could not inflate Behavior subclass com.google.android.material.bottomsheet.BottomSheetBehavior। मैंने इसे केवल माता-पिता को बदलकर तय कियाTheme.MaterialComponents.Light.DarkActionBar । इससे किसी भी तरह से हमारे विषय पर कोई असर नहीं पड़ा लेकिन आरटीई समाप्त हो गया। आप भी अपनी शैली के लिए आवश्यक वस्तुओं को शामिल करके इस मुद्दे को ठीक कर सकते हैं। लेकिन मुझे यह पता लगाने में दिक्कत नहीं हुई कि बॉटमशीटबहेवियर द्वारा कौन से स्टाइल की आवश्यकता थी।

दूसरे, जैसा मैं कर सकता हूं, कोशिश करें, लेकिन मुझे वास्तविक फ़्रेम लेआउट नहीं मिल सका (जो बॉटमशीटडायलॉगफ्रेगमेंट था) गोल कोनों का उपयोग करता है। मुझे एहसास हुआ कि यह एक छवि के लिए सेटिंग करने योग्य काम किया है, लेकिन एक आकार या एक के साथ नहीं @null। पता चला है, क्योंकि LinearLayoutमैं उपयोग कर रहा था एक पृष्ठभूमि परिभाषित किया गया था। यह शैली में किसी भी पृष्ठभूमि को ओवरराइड कर रहा था। इसे हटाने से अंत में गोल कोनों का निर्माण हुआ।

इसके अलावा, मुझे कोनों को गोल करने के लिए किसी भी पृष्ठभूमि आकार की आवश्यकता नहीं थी। @ गैब्रिएल मैरीओटी के समाधान ने जैसे ही उपरोक्त बदलाव किए, मैंने काम किया। हालाँकि, पृष्ठभूमि रंग निर्धारित करने के लिए कि मैं क्या चाहता था, मुझे "बैकग्राउंड" आइटम को ओवरराइड करना पड़ा।

पुनश्च: मैं एंड्रॉइड देव के लिए नया हूं, और हमारे कॉलेज में आंतरिक उपयोग के लिए बनाया गया एक पुराना ऐप बना रहा हूं। मैं एंड्रॉइड के लेआउट सिस्टम या सामग्री पुस्तकालय के साथ परिचित नहीं हूं। मुझे लगता है कि इसीलिए मुझे यह पता लगाने में 3 दिन लग गए। मुझे आशा है कि यह भविष्य में किसी के लिए उपयोगी है।


1

इन दो तरीकों को अपने बॉटलशीटडायलॉगफ्रेगमेंट वर्ग में जोड़ें।

public void setDialogBorder(Dialog dialog) {
        FrameLayout bottomSheet = (FrameLayout) dialog.getWindow().findViewById(android.support.design.R.id.design_bottom_sheet);
        bottomSheet.setBackground(new ColorDrawable(Color.TRANSPARENT));
        setMargins(bottomSheet, 10, 0, 10, 20);
    }

    private void setMargins(View view, int left, int top, int right, int bottom) {
        if (view.getLayoutParams() instanceof ViewGroup.MarginLayoutParams) {
            ViewGroup.MarginLayoutParams p = (ViewGroup.MarginLayoutParams) view.getLayoutParams();
            p.setMargins(left, top, right, bottom);
            view.requestLayout();
        }
    }

अब अपने बॉटलशीटडायलॉगफ्रैगमेंट क्लास की setDialogBorder(dialog)विधि में कॉल विधि setupDialog()

अब अपने drawable फ़ोल्डर में एक आकृति फ़ाइल बनाएँ।

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <corners android:radius="20dp" />

    <solid android:color="@color/white" />
    <stroke
        android:width="1dp"
        android:color="@color/transparent" />
</shape>

अब xml फ़ाइल में पैरेंट व्यूग्रुप संवाद दृश्य के लिए पृष्ठभूमि सेट करें।

android:background="@drawable/round_border_white"

किया हुआ!!


आप सेटमैरिज के साथ किस दृश्य का उपयोग करते हैं?
tmm1

फ़्रेमलेयआउट बॉटमशीट; यह एक setDialogBorder () विधि में परिभाषित किया गया है। यह वास्तव में Android में नीचे शीट संवाद के लिए डिफ़ॉल्ट दृश्य है। यह ठीक काम करेगा।
दलवीरसिंहदया ०ve ’

0

इस समस्या को ठीक करने का दूसरा तरीका है बॉटमशीटडायलॉग का विस्तार करना और एक कस्टम क्लास बनाना जो आपकी आवश्यकताओं के अनुरूप हो। आप लेआउट xml फ़ाइल के लिए ऐसा ही कर सकते हैं, और पृष्ठभूमि या किसी अन्य अनुकूलन को जोड़ सकते हैं। इसका एक लाभ यह भी है कि आप बैकग्राउंड बदलते समय Android (android.support.design.R.id.design_bottom_sheet) द्वारा उपयोग किए जाने वाले आईडी नामों पर निर्भर नहीं होंगे (हालाँकि आईडी नाम का परिवर्तन शायद ही कभी होता है)।


0

गोल कोने के साथ एक कस्टम ड्रॉबल बनाएं और इसे अपने बॉटमशीटडायलॉगफ्रेगमेंट के लेआउट रूट की पृष्ठभूमि के रूप में सेट करें

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">

<solid android:color="@color/colorPrimary" />

<corners
    android:bottomLeftRadius="0dp"
    android:bottomRightRadius="0dp"
    android:topLeftRadius="12dp"
    android:topRightRadius="12dp" />

</shape>

और फिर नीचे दिए गए कोड को अपने बॉटमशीटडायलॉगफ्रैगमेंट वर्ग में जोड़ें

@Override
public void setupDialog(Dialog dialog, int style) {
    super.setupDialog(dialog, style);
    View contentView = View.inflate(getContext(), 
R.layout.fragment_bottom_sheet, null);
    dialog.setContentView(contentView);

    CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) ((View) contentView.getParent())
            .getLayoutParams();
    CoordinatorLayout.Behavior behavior = params.getBehavior();
    ((View) contentView.getParent()).setBackgroundColor(ContextCompat.getColor(getContext(), android.R.color.transparent));
}

तुम भी नीचे की तरह मार्जिन सेट करने के लिए params के साथ खेल सकते हैं

params.setMargins(50, 0, 50, 0);

0

आपको bottom sheet themeशीर्ष राउंड लेआउट को प्राप्त करने के लिए बदलना होगा

एक कस्टम ड्रॉबल बैकग्राउंड बनाएं_बॉटम_शीट_डायलॉग_फ्रैगमेंट.xml:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
   android:shape="rectangle">
    <corners
       android:topLeftRadius="8dp"
        android:topRightRadius="8dp" />
    <padding android:top="0dp" />
    <solid android:color="@color/white" />
</shape>

फिर ओवरराइड करेंशीतलडिअलॉगथीम को स्टाइल पर करें। बैकग्राउंड के रूप में ड्रॉबल का उपयोग करके:

<!--Bottom sheet-->
<style name="BottomSheet" parent="@style/Widget.Design.BottomSheet.Modal">
    <item 
    name="android:background">@drawable/background_bottom_sheet_dialog_fragment
    </item>
</style>

<style name="BaseBottomSheetDialog" 
    parent="@style/Theme.Design.Light.BottomSheetDialog">
    <item name="android:windowIsFloating">false</item>
    <item name="bottomSheetStyle">@style/BottomSheet</item>
</style>

<style name="BottomSheetDialogTheme" parent="BaseBottomSheetDialog" />

यह आपकी निचली शीट की पृष्ठभूमि लेआउट को बदल देगा

BottomSheetDialog

class SheetFragment() : BottomSheetDialogFragment() {

    lateinit var binding: SheetFragmentBinding;

  override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
    val dialog = super.onCreateDialog(savedInstanceState) as BottomSheetDialog;
    val view = View.inflate(context, R.layout.fragment_bottom_sheet, null);

    binding = DataBindingUtil.bind(view)!!;
    binding.viewModel = SheetFragmentVM();

    dialog.setContentView(view);

    var bottomSheetBehavior = BottomSheetBehavior.from(view.parent as View);
    bottomSheetBehavior.setPeekHeight(BottomSheetBehavior.PEEK_HEIGHT_AUTO);

    bottomSheetBehavior.setBottomSheetCallback(object : 
     BottomSheetBehavior.BottomSheetCallback() {
        override fun onStateChanged(bottomSheet: View, newState: Int) {
            if (BottomSheetBehavior.STATE_EXPANDED == newState) {
               // do on STATE_EXPANDED
            }
            if (BottomSheetBehavior.STATE_COLLAPSED == newState) {
                // do on STATE_COLLAPSED
            }

            if (BottomSheetBehavior.STATE_HIDDEN == newState) {
                dismiss()

            }
        }

        override fun onSlide(bottomSheet: View, slideOffset: Float) {
           // do on slide
        }
    })

    return dialog
}

0

गोल कोने के साथ आकार जोड़ें, इसे अपने रूट लेआउट के लिए पृष्ठभूमि बनाएं

<?xml version="1.0" encoding="utf-8" ?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
 <corners
    android:topLeftRadius="@dimen/padding_margin_16_dp"
    android:topRightRadius="@dimen/padding_margin_16_dp" />
 <solid android:color="@color/white" />
</shape>

अपने बॉटमशीटडायलॉगफ्रैगमेंट पर बैकग्राउंड को पारदर्शी बनाएं

override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)
    (view?.parent as View).setBackgroundColor(Color.TRANSPARENT)
}

कॉन्ट्राइंटलेउटआउट, फ्रामेलीउट, लिनियरलेआउट, रिलेटिवेलआउट के लिए इसका काम।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.