BottomSheetDialogFragment için yuvarlak köşe


115

özel bir BttomSheetDialogFragment'ım var ve Alttan Görünümün üstünde yuvarlak köşeler olmasını istiyorum

bu, alttan görünmesini istediğim düzenimi şişiren Özel sınıfım

View mView;

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

ve ayrıca bu xml kaynak dosyasına arka plan olarak sahibim:

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

ancak sorun şu ki, bu kaynak dosyasını Layout'umun kök öğesinin arka planı olarak ayarladığımda köşeler hala yuvarlanmıyor

ve aşağıdaki kodu kullanamıyorum:

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

BottomSheetDialog'un varsayılan arka planını geçersiz kıldığı ve Alt Görünümümün üzerinde yarı saydam gri renk olmayacağı için


5
@RasoolGhana - Şu bağlantıya bir göz atın: medium.com/halcyon-mobile/…
Mohit Charadva

Yanıtlar:


238

Özel bir çekmece oluşturun 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>

Sonra geçersiz bottomSheetDialogThemeüzerinde styles.xmlarka plan olarak çekilebilir kullanılarak:

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

Bu, uygulamanızın tüm BottomSheetDialog'larını değiştirecektir.


2
Benim için çalışıyor. Ayrıca düzen kök öğesine bağlı olduğunu fark ettim. Öncelikle kök olarak kart görünümüm vardı (çünkü köşeleri yuvarlamak için başka bir yol denedim), sonra onu doğrusal düzene değiştirdim ve şimdi mükemmel çalışıyor
Ivan Shafran

1
Android api 17'de kilitleniyor
Morteza Rastgoo

1
Ben kullanmak ister rounded_dialog& AppModalStylesadece bir alt tabaka tarzı ile bu tür bir arka plan kullanmak beklediğiniz gibi, sadece üst köşeleri yuvarlatılmış olan bir arka plan ile isimleri. Peki ya bottomsheet_rounded_background&AppBottomSheetStyle
hmac

3
Kök görünümde bir arka plan belirlerseniz bu, bu ayarı geçersiz kılacaktır
hmac

3
sayfa düzeninizin kök öğesiyle ilgili herhangi bir arka planınız olmadığından emin olun!
MMK

84

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 BottomSheetDialogFragmentgeçersiz kılın onCreateViewve ardından Alt Sayfa İletişim Kutuları için özel stilinizi tanımlayın.

bottomSheetDialogThemeÖzniteliği styles.xmluygulama temanızda tanımlayın :

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

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>

görüntü açıklamasını buraya girin


Bu yöntemi geçersiz kılarak aynı davranışı BottomSheetDialogFragment( bottomSheetDialogThemeuygulamanı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 BottomSheetBehaviorve geçersiz kılınması imkansızdır.
Ancak bir çözüm var -> SORUMLULUK REDDİ: sonraki sürümlerde çalışmayı durdurabilir !!

Bir ekleyebilir BottomSheetCallbackiç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) {
          //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 bu tekniği kullanarak, sayfada herhangi bir yere dokunursam ve göz ardı edilmezse, köşeler canlanır. Android malzeme bileşenlerini geliştirip geliştirmediğinizden emin değilim, ancak öyleyse, bu sorunu biliyor muydunuz? 1.1.0-alpha10 kullanıyordum ama beta2'yi de kontrol ettim. Sayfaya koyduğum tam görünümlere bağlı olup olmadığından emin değilim.
androidguy

1
Bu sorunu bildirdim: issuetracker.google.com/issues/144859239 Herhangi birinin sorunla ilgili daha fazla bulgusu veya çözümü varsa, lütfen yanıtlayın. Teşekkürler!
androidguy

4
Bu hatayı alıyorum ve v1.1.0-beta02Could not inflate Behavior subclass com.google.android.material.bottomsheet.BottomSheetBehavior
hkchakladar

3
Alt sayfa iletişim kutusu genişletilirse çalışmaz. Herhangi bir fikir?
José Carlos

4
Bu mükemmel ve en son cevaptı. Bunu cevap olarak işaretlemem gerekiyor
Vikas Acharya

38

BottomSheetDialogKöşeler görünmez neden varsayılan bir beyaz arka plan rengini kuruyor, bu tarzı geçersiz kılarak iletişim şeffaf arka planını yapmak gerekir göstermek amacıyla, bir BottomSheetDialog.

Bu stili senin içinde tanımla 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>

Ve bu stili BottomSheetDialog'unuza ayarlayın

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
Kabul edilen cevaptan daha iyi, çünkü bu şekilde farklı BottomSheetDialogs'ta farklı geçmişlere sahip olabilirsiniz
Luke

Şimdi eğri görünür, ancak dokunmatik ekran boyunca şeffaf bir renk yalnızca alt iletişim kutusundaki beyaz renk görünür @ Hata herhangi bir düzeltme var mı?
Arnold Brown

Aradığım çözüm buydu, Tamamen ücretsiz hack.
Prateek Gupta

26

rounded_corners_shape adlı bir şekil oluştur

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

bir stil tanımla

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

bu stili özel BottomSheetDialogFragment'ınızda bu şekilde kullanın, işe yarayacak!

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

      ...
    }

Kodla birlikte biraz açıklama eklemeniz faydalı olacaktır.
UditS

Bu, e-postalar için tema ayarlamak için doğru yerdir Fragment.
DYS

10

Malzeme bileşeninin son sürümünü kullanırsanız, sadece geçersiz kılmanız ShapeAppearance.MaterialComponents.LargeComponent(alt sayfa bu şekli kullandığından) ve istediğiniz değeri ayarlamanız gerekir:

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

Ardından uygulamanızın stilini ayarlayın:

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

Gabriele Mariotti'nin çözümü benzer ve işe yarıyor ama bu daha basit.


Diğerleriyle karşılaştırıldığında bu çok daha iyi bir çözüm çünkü mevcut çözümün çoğu özel set
çekmecesine dayanıyor

1
Güzel gözüküyor. Bu aynı zamanda için de geçerli BottomSheetDialogmi?
Jaden Gu

1
ShapeAppearance.MaterialComponents.LargeComponentHerkese not: Bu cevabı kullanmak , kullanan tüm bileşenlerin sadece Bottom Sheet değil, aynı cornerSize ve familyaya sahip olmasına neden olacaktır . Stil gereksiniminizi kontrol edin ve tüm bileşen için mi yoksa yalnızca tek bir bileşen veya widget için mi görünümü değiştirmek istediğinize karar verin.
nitinkumarp

9

Cevaplar Koma Yip gelen başka bir soru benim için çalıştı, bunu denemelisiniz.

Çizilebilir bir XML oluşturun, diyalog_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>

bunu düzen xml kök düğümünüze yerleştirin:

xml düzeninizde arka plan olarak ayarlayın

android:background="@drawable/dialog_bg"

ve şunu onCreateView()koyun:

diyaloğunuzun arka planını şeffaf olarak ayarlayın

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

Bu doğru çözüm olmalı çünkü tüm DialogFragments için çemberlerden atlamadan çalışıyor.
jssingh

3
Benim için yuvarlak köşelerimin arkasında hala beyaz köşeler var. Dolayısıyla, çizilebilirimin rengini kırmızıya çevirdiğimde, kodunuz doğru çalışıyor ve yuvarlak kırmızı bir dikdörtgen oluşturuyor, ancak bunun arkasında hala varsayılan bir beyaz dikdörtgen var. "Dialog.getWindow (). SetBackgroundDrawable ..." kodu yer değişimi benim iletişim yukarıdaki alanı "karartılmış" entire rengini yazdım ama yine, bu iki küçük köşeleri kaçırır. Bu soruna neyin neden olabileceğini biliyor musunuz?
Nick Dev

Yukarıdaki yorumuma ek olarak, kodumun çalışması için onCreateView () içindeki kodu " getDialog () .getWindow () ..." olarak değiştirmem gerektiğini not etmeliyim . Belki de bu yüzden benim için işe yaramıyor.
Nick Dev

1
@NickDev Bu çözümün kodunuz için geçerli olmadığını düşünüyorsanız yeni bir soru gönderin ve belki bir çözüm bulabiliriz.
Variag

@Variag Bize ulaştığınız için teşekkürler; Aslında, varsayılan alt sayfa modal diyaloğunu arkasındaki karanlık alanla aynı renkte bir dikdörtgenle kapladığım ucuz bir geçici çözüm buldum. Sonra bunun üzerine köşeleri yuvarlatılmış ikinci bir dikdörtgen ekledim. İdeal değil ama harika görünüyor! Yine de yardımın için minnettarım.
Nick Dev

8

Bugün aynı şeyi kontrol ediyordum ve evet kodu takip etme konusunda haklıydın

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

bu parça arka planı için geçerlidir, bu nedenle, iletişim penceresinden alt sayfa görünümünü almalı ve arka planı değiştirmelisiniz.

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

buradaki alt sayfa, değiştirmek istediğiniz gerçek görünümdür.


Bunu çalıştırmamın tek yolu. Btw BottomSheetDialogFragment, mantığın onCreateDialogyöntemde olması için kullanıyorum
Kirill Starostin

6
  1. Alt sayfa için arka plan olarak kullanacağımız bir şekil çizilebilir .. oluşturun. Sol üst ve sağ köşenin yarıçapı için uygun değeri sağlayın.

    <?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. Şimdi "Alt sayfa iletişim kutusu bölümü" için stil oluşturun

    <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. Şimdi, stilinizi sağladığınız BottomSheetDilogFragment'ı genişletecek özel bir sınıf oluşturun.

    open class CustomRoundBottomSheet : BottomSheetDialogFragment() {
    
        override fun getTheme(): Int = R.style.BottomSheetDialogTheme
    
        override fun onCreateDialog(savedInstanceState: Bundle?): Dialog = BottomSheetDialog(requireContext(), theme)
    
    }
    
  4. Şimdi bu sınıfı yuvarlak köşeli alt tabakaya sahip olmak istediğiniz her yerde kullanın. Örneğin

    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

Benim için çalıştı

shape_rounded_dialog adlı bir şekil oluştur

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

aşağı stilleri ekle

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

DialogFragment sınıfında, yöntemi geçersiz kılma getTheme ayrıca Yourself stilini de döndürür.

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

4

Bu cevap sadece Color.TRANSPARENT, düzene yuvarlatılmış arka plana sahip bir çizim oluşturduktan sonra arka plan rengini ayarlama sorunu içindir .

Çözümü Color.TRANSPARENTgeçersiz kılma dışında arka plan rengini ayarlamak için yanıtların hiçbiri işe yaramadı 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));
}

ANCAKcontentView burada iletişim için ayarlanmış değil viewsen almak onViewCreated()içinde Şişirirken onCreateView(). Bu kullanamaz gibi pek sıkıntı verebilir, standart akışını keser View Bindings- Kotlin Android ExtensionsinonViewCreated()

Bu yüzden arka planı ayarlamak için biraz ince ayar yapıyorum onActivityCreated():

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

Umarım bu aynı sorunu yaşayan yardım eder


2

Bu sorunun zaten kabul edilmiş bir cevabı olduğunu biliyorum. Yaşadığım sorunları ve nihayet onu nasıl çalıştırdığımı belgelemek istiyorum, böylece gelecekteki biri için yararlıdır.

İlk Theme.AppCompat.Light.DarkActionBarolarak, bizim için ebeveyn olarak kullanıyordum AppTheme. Bu, @Gabriele Mariotti çözümünün hatayla çökmeye devam ettiği anlamına geliyordu Could not inflate Behavior subclass com.google.android.material.bottomsheet.BottomSheetBehavior. Bunu sadece ebeveyni olarak değiştirerek düzelttim Theme.MaterialComponents.Light.DarkActionBar. Bu, temamızı hiçbir şekilde etkilemedi ama RTE gitmişti. Bu sorunu, stilinize gerekli öğeleri ekleyerek de çözebilirsiniz. Ancak BottomSheetBehavior tarafından hangi stillerin gerekli olduğunu bulmakla uğraşmadım.

İkinci olarak, elimden geldiğince deneyin, ancak yuvarlak köşelere sahip olmak için kullanılan gerçek Çerçeve düzenini (BottomSheetDialogFragment idi) alamadım. Bunu bir Drawable görüntüsüne ayarlamanın işe yaradığını ancak bir şekil veya a ile çalışmadığını fark ettim @null. Görünüşe göre LinearLayout, kullandığımın tanımlanmış bir arka planı vardı. Bu, stildeki herhangi bir arka planı geçersiz kılıyordu. Bunu kaldırmak nihayet yuvarlatılmış köşelerle sonuçlandı.

Ayrıca, köşeleri yuvarlatmak için herhangi bir arka plan şekline ihtiyacım yoktu. @Gabriele Mariotti'nin çözümü, yukarıdaki değişiklikleri yapar yapmaz işe yaradı. Ancak, arka plan rengini olmasını istediğim rengi ayarlamak için "backgroundTint" öğesini geçersiz kılmam gerekiyordu.

Not: Android geliştirmede yeniyim ve Kolejimizde dahili kullanım için yapılmış eski bir Uygulamayı sürdürüyorum. Android'in düzen sistemine veya materyal kitaplığına pek aşina değilim. Sanırım bu yüzden bunu çözmem 3 günümü aldı. Umarım bu gelecekte birileri için yararlıdır.


1

BottomsheetDialogFragment sınıfınıza bu iki yöntemi ekleyin.

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

Şimdi diyoruz setDialogBorder(dialog)yöntemi setupDialog()sizin BottomsheetDialogFragment sınıfının yöntemine.

Şimdi çekilebilir klasörünüzde bir şekil dosyası oluşturun.

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

Şimdi xml dosyasında üst görünüm grubu iletişim kutusu görünümü için arka planı ayarlayın.

android:background="@drawable/round_border_white"

Bitti !!


SetMargins ile hangi görünümü kullanıyorsunuz?
tmm1

FrameLayout bottomSheet; Bu setDialogBorder () yönteminde tanımlanmıştır. Bu aslında android'deki alt sayfa diyaloğu için varsayılan görünümdür. İyi çalışacak.
DalveerSinghDaiya

1

yuvarlak köşeli şekil ekleyin, kök düzeniniz için arka plan yapın

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

BottomSheetDialogFragment üzerinde arka planı saydam yapın

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

Contraintlayout, Framelyaout, Linearlayout, Relativelayout için çalışması.


0

Bu sorunu çözmenin başka bir yolu da BottomSheetDialog'u genişletmek ve ihtiyaçlarınıza uygun özel bir sınıf oluşturmaktır. Aynı şeyi düzen xml dosyası için yapabilir ve arka plan veya gerekli diğer özelleştirmeleri ekleyebilirsiniz. Bu aynı zamanda, arka planı değiştirirken Android tarafından kullanılan kimlik adlarına (android.support.design.R.id.design_bottom_sheet) bağımlı olmamanızı sağlayan bir avantaja da sahiptir (kimlik adının değiştirilmesi nadiren AFAIK olur).


0

Yuvarlak köşeli özel bir çizim oluşturun ve bunu BottomSheetDialogFragment'in mizanpaj kökünün arka planı olarak ayarlayın

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

Ve sonra aşağıdaki kodu BottomSheetDialogFragment sınıfınıza ekleyin.

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

Aşağıdaki gibi marjı ayarlamak için parametrelerle bile oynayabilirsiniz

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

0

En bottom sheet themeüst tur düzenini elde etmek için değiştirmelisiniz

Özel bir çekilebilir background_bottom_sheet_dialog_fragment.xml oluşturun:

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

Ardından, arka plan olarak çekilebilir olanı kullanarak styles.xml'de bottomSheetDialogTheme'yi geçersiz kılın:

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

Bu, alt sayfanızın arka plan düzenini değiştirecek

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
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.