বটমশিটডায়ালগফ্র্যাগমেন্টের জন্য বৃত্তাকার কর্নার


114

আমার কাছে একটি কাস্টম বিটিএমশিটডায়ালগ ফ্রেম রয়েছে এবং আমি নীচের দৃশ্যের উপরে গোলাকার কোণগুলি রাখতে চাই

এটি আমার কাস্টম ক্লাস যা আমার লেআউটটি স্ফীত করে যা আমি নীচ থেকে উপস্থিত হতে চাই

View mView;

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

এবং ব্যাকগ্রাউন্ড হিসাবে আমার এই এক্সএমএল রিসোর্স ফাইলটি রয়েছে:

<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);

বটমশিটডায়ালগের এটির ওভাররাইড ডিফল্ট ব্যাকগ্রাউন্ডটি সিজ করুন এবং আমার নীচের দৃশ্যের উপরে কোনও আধা-স্বচ্ছ ধূসর বর্ণ থাকতে পারে না


4
: - @RasoolGhana এই লিঙ্কে কটাক্ষপাত আছে medium.com/halcyon-mobile/...
মোহিত Charadva

উত্তর:


238

একটি কাস্টম অঙ্কনযোগ্য তৈরি করুন 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>

এটি আপনার অ্যাপের সমস্ত বটমপত্রক ডায়ালগগুলি পরিবর্তন করবে will


4
এটা আমার জন্য কাজ করে. এছাড়াও আমি লক্ষ্য করেছি যে এটি বিন্যাসের মূল উপাদানটির উপর নির্ভর করে। প্রথমত আমার রুট হিসাবে কার্ডভিউ ছিল (কারণ আমি কোণার অন্য দিকে চেষ্টা করেছি), তারপরে আমি এটিকে রৈখিক বিন্যাসে পরিবর্তন করেছি এবং এখন এটি পুরোপুরি কাজ করে
ইভান শফরান

4
অ্যান্ড্রয়েড এপিআই-তে ক্র্যাশ 17
মর্টেজা রাস্তগু

4
আমি ব্যবহার করবে না rounded_dialogAppModalStyleএকটি ব্যাকগ্রাউন্ড যেখানে শুধুমাত্র উপরের কোণে গোলাকার সঙ্গে নাম, যেমন আপনি শুধুমাত্র একটি নীচে চাদর শৈলী সঙ্গে যেমন একটি পটভূমি ব্যবহার করতে আশা করবে। কীভাবে bottomsheet_rounded_background&AppBottomSheetStyle
এইচএম্যাক

4
নোট আপনি যদি
রট

4
আপনার শীট বিন্যাসের মূল উপাদানটির কোনও পটভূমি নেই তা নিশ্চিত করুন!
এমএমকে

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করছেন এবং সমস্ত অ্যাপ্লিকেশনটিতে নয়।


প্রসারিত রাষ্ট্র সম্পর্কে গুরুত্বপূর্ণ নোট :

প্রসারিত অবস্থায় নীচের অংশে সমতল কোণ রয়েছে । আপনি গিথুব রেপোতে সরকারী মন্তব্যটি পরীক্ষা করতে পারেন :

আমাদের নকশা দলটি দৃ strongly়তার সাথে মতামত দেয় যে বৃত্তাকার কোণগুলি স্ক্রোলযোগ্য সামগ্রী নির্দেশ করে এবং সমতল কোণগুলি দেখায় যে কোনও অতিরিক্ত সামগ্রী নেই। যেমনটি, তারা চায় না যে আমরা এই পরিবর্তনটি ফিটটোকন্টেন্টের সাথে যুক্ত করব to

এই আচরণটি সরবরাহ করেছে 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;
  }

4
@ গ্যাব্রিলেমারিওটি ​​এই কৌশলটি ব্যবহার করে যদি আমি শীটটিতে কোথাও ট্যাপ করি এবং এটি বরখাস্ত না করা হয় তবে কোণগুলি অ্যানিমেটেড হবে। আপনি অ্যান্ড্রয়েড উপাদানের উপাদানগুলিতে বিকাশ করেছেন কিনা তা নিশ্চিত নই তবে আপনি যদি হন তবে আপনি কি এই সমস্যাটি সম্পর্কে জানতেন? আমি 1.1.0-alpha10 ব্যবহার করছিলাম, তবে আমি কেবল বিটা 2ও পরীক্ষা করেছি। আমি শীটটিতে যে সঠিক দৃষ্টিভঙ্গি রেখেছি তা নির্ভর করে কিনা তা আমি নিশ্চিত নই।
androidguy

4
আমি এই ইস্যুটি রিপোর্ট করেছি: ইস্যুতেআরেকার.কম। / ইস্যুগুলি / 144859239 যদি কারও কাছে এই সমস্যার জন্য আরও কোনও অনুসন্ধান বা সমাধান থাকে, দয়া করে উত্তর দিন। ধন্যবাদ!
অ্যান্ড্রয়েডগুই

4
আমি এই ত্রুটিটি পেয়েছি এবং v1.1.0-beta02 এ ক্র্যাশ করছিCould not inflate Behavior subclass com.google.android.material.bottomsheet.BottomSheetBehavior
hkchakladar

4
নীচের শীট ডায়ালগটি প্রসারিত করা হলে এটি কাজ করে না। কোন ধারণা?
জোসে কার্লোস

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();

4
গৃহীত উত্তরের চেয়ে ভাল, কারণ এইভাবে আপনার বিভিন্ন বটমশিট ডায়ালগগুলিতে বিভিন্ন ব্যাকগ্রাউন্ড থাকতে পারে
লূক

এখন বক্ররেখা দৃশ্যমান, তবে কেবলমাত্র নীচে ডায়ালগের সাদা রঙের স্পর্শে পুরো স্ক্রীন জুড়ে একটি স্বচ্ছ রঙ দেখা যাবে @ বাডারের কোনও সংশোধন?
আর্নল্ড ব্রাউন

এটিই আমি সমাধানটি সন্ধান করছিলাম, সম্পূর্ণ হ্যাক করুন।
প্রীতেক গুপ্ত

26

গোলাকার_কর্ণার_শ্যাপি নামের একটি আকার তৈরি করুন

<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);
      }

      ...
    }

আপনি কোডের সাথে কিছু স্পষ্টতা যোগ করলে এটি সহায়ক হবে।
উদিতস

এটি থিম সেট করার জন্য সঠিক জায়গা Fragment
ডিওয়াইএস

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>

গ্যাব্রিয়েল মেরিওটির সমাধানটি একই রকম এবং খুব কার্যকর হয় তবে এটি সহজ।


অন্যান্যগুলির তুলনায় এটি একটি আরও ভাল সমাধান, কারণ বেশিরভাগ সমাধানই কাস্টম
আঁকতে

4
ভাল দেখাচ্ছে. এটিও কি প্রযোজ্য BottomSheetDialog?
যাদেন গু

4
সবার জন্য দ্রষ্টব্য: এই উত্তরটি ব্যবহার ShapeAppearance.MaterialComponents.LargeComponentকরার ফলে কেবল নীচের অংশে নয়, সমস্ত কোণার সাইজ এবং পরিবার ব্যবহারের সমস্ত উপাদান তৈরি হবে। আপনার শৈলীর প্রয়োজনীয়তা যাচাই করুন এবং সিদ্ধান্ত নিন যে আপনি সমস্ত উপাদান বা কেবল স্বতন্ত্র উপাদান বা উইজেটের উপস্থিতি পরিবর্তন করতে চান।
নিতনকুমার্প

9

দ্বারা উত্তর অন্য একটি প্রশ্ন থেকে কোমা ইয়পের আমার পক্ষে কাজ করেছে, আপনার এটি চেষ্টা করা উচিত।

অঙ্কনযোগ্যতে একটি এক্সএমএল তৈরি করুন, ডায়লগ_বিজি.এক্সএমএল বলুন

<?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>

এটি আপনার লেআউট এক্সএমএল রুট নোডে রাখুন:

এটি আপনার লেআউট এক্সএমএলে ব্যাকগ্রাউন্ড হিসাবে সেট করুন

android:background="@drawable/dialog_bg"

এবং ভিতরে onCreateView() করা:

আপনার কথোপকথনের পটভূমিটি স্বচ্ছ করুন

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

এটি সঠিক সমাধান হওয়া উচিত কারণ এটি হুপের মাধ্যমে ঝাঁপ না দিয়ে সমস্ত ডায়ালগফ্র্যাগমেন্টের জন্য কাজ করে।
jssingh

4
আমার জন্য আমার গোলাকার কোণগুলির পিছনে এখনও সাদা কোণ রয়েছে are সুতরাং আমি যখন আমার আঁকার রঙটি লাল রঙে পরিবর্তন করি তখন আপনার কোডটি সঠিকভাবে কাজ করে এবং একটি বৃত্তাকার লাল আয়তক্ষেত্র তৈরি করে, তবে এর পিছনে এখনও একটি ডিফল্ট সাদা আয়তক্ষেত্র রয়েছে। "Dialog.getWindow ()। SetBackgroundDrawable ..." আপনি যে কোডটি পরিবর্তন লিখেছিলেন সমগ্র "কালো" আমার ডায়ালগ উপরে জায়গার রঙ, কিন্তু আবার, সেই দুই সামান্য কোণে ব্যার্থ। আপনি কি জানেন যে এই সমস্যাটির কারণ কী হতে পারে?
নিক দেব 13

উপরে আমার মন্তব্যের উপর যোগ করার পদ্ধতি, আমি জানানো হচ্ছে যে আমি কোড পরিবর্তন করতে হয়েছিল ) onCreateView ( থেকে " getDialog () .getWindow () ..." অর্ডার চালানোর জন্য আমার কোড জন্য। সম্ভবত এটি আমার জন্য কাজ করে না।
নিক দেব 16

4
@ নিকডেভ নতুন প্রশ্ন পোস্ট করুন আপনি যদি ভাবেন যে এই সমাধানটি আপনার কোডে প্রযোজ্য না এবং সম্ভবত আমরা একটি সমাধান খুঁজে বের করব।
ভারিগ

@ ভারিয়াগ পৌঁছে দেওয়ার জন্য ধন্যবাদ; আমি আসলে একটি সস্তা কাজের সাথে হাজির হয়েছি যেখানে আমি ডিফল্ট নীচে শীট মডেল ডায়ালগটি একটি আয়তক্ষেত্রের সাথে কভার করি যা এর পিছনে অন্ধকার অঞ্চল হিসাবে একই রঙ। তারপরে আমি গোলাকার কোণগুলির সাথে একটি দ্বিতীয় আয়তক্ষেত্র যুক্ত করেছি ers এটি আদর্শ নয়, তবে দুর্দান্ত দেখাচ্ছে! আমি তবুও সাহায্যের প্রশংসা করি।
নিক দেব

8

আমি আজ একই জিনিসটি পরীক্ষা করে দেখছিলাম এবং হ্যাঁ আপনি কোড অনুসরণের বিষয়ে ঠিক বলেছেন

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

এটি খণ্ডের পটভূমিতে প্রযোজ্য, সুতরাং পরিবর্তে আপনার ডায়ালগ উইন্ডো থেকে বোতল শীট প্রদর্শন করা উচিত এবং পটভূমিটি এখানে পরিবর্তন করা উচিত কোড is

 @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);
    }

এখানে বোতলমসিটটি হ'ল আসল দৃশ্য যা আপনি পরিবর্তন করতে চান।


আমি এই কাজ পেয়েছিলাম একমাত্র উপায়। বিটিডব্লু আমি ব্যবহার করছি BottomSheetDialogFragmentযাতে যুক্তিটি onCreateDialogপদ্ধতিতে আসে
কিরিল স্টারোস্টিন

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 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 ExtensionsonViewCreated()

তাই আমি পটভূমি সেট করতে কিছুটা টুইট করি 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() আপনার BottomsheetDialogFragment বর্গ পদ্ধতি।

এখন আপনার অঙ্কনযোগ্য ফোল্ডারে একটি আকার ফাইল তৈরি করুন।

<?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>

এখন এক্সএমএল ফাইলে প্যারেন্ট ভিউগ্রুপ ডায়ালগ ভিউয়ের জন্য পটভূমি সেট করুন।

android:background="@drawable/round_border_white"

সম্পন্ন!!


আপনি সেটমার্গিনগুলির সাথে কোন দৃশ্য ব্যবহার করেন?
tmm1

ফ্রেমলআউট বিট শাট; এটি সেটডায়ালগর্ডার () পদ্ধতিতে সংজ্ঞায়িত। এটি আসলে অ্যান্ড্রয়েডের নীচে শীট সংলাপের জন্য ডিফল্ট দৃশ্য। এটা ঠিক কাজ করবে।
দলভীরসিংহডাইয়া

1

বৃত্তাকার কোণার সাথে আকার যুক্ত করুন, এটি আপনার মূল বিন্যাসের জন্য পটভূমি করুন

<?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)
}

কনট্রিনেন্টলেআউট, ফ্রেমিলিয়াআউট, লিনিয়ার্লেআউট, রিলেটিভলেআউট এর জন্য এটির কাজ।


0

এই সমস্যাটি সমাধানের আর একটি উপায় হ'ল বটমশিটডায়ালগ বাড়ানো এবং আপনার প্রয়োজন অনুসারে একটি কাস্টম ক্লাস তৈরি করা su আপনি লেআউট এক্সএমএল ফাইলের জন্য একই কাজ করতে পারেন এবং ব্যাকগ্রাউন্ড বা অন্য কোনও পছন্দসই সংযুক্তি যুক্ত করতে পারেন। এর একটি সুবিধাও রয়েছে যে আপনি পটভূমি পরিবর্তন করার সময় অ্যান্ড্রয়েড (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.setMargins(50, 0, 50, 0);

0

bottom sheet themeশীর্ষ রাউন্ডের বিন্যাসটি অর্জন করতে আপনাকে পরিবর্তন করতে হবে

একটি কাস্টম অঙ্কনযোগ্য পটভূমি_ নীচে_শিট_ডায়ালগ_ফ্র্যাগমেন্ট.এক্সএমএল তৈরি করুন:

<?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" />

এটি আপনার নীচের শীটের পটভূমির বিন্যাস পরিবর্তন করবে

নীচে শীটডায়ালগ

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
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.