見出し画像

BottomSheetDialogFragmentの角を丸くする

Material ComponentsのBottomSheetDialogFragmentの角はデフォルトで丸くありませんが、Twitterなどを見ると上部の角が丸くなっているデザインをよくみます。これのやり方です。

完成形はこんな感じです。
(Layoutの勉強でTwitterを真似して作ってます)

画像1

方法は2パターン

やり方は2通りあります。
1. BottomSheetDialogFragmentのデフォルトのThemeをOverrideする方法
2. Themeを新しく作って個別にデザインを適用する方法

個人的には2の方がいいかなと思いますが、両方書いておきます。なお、普通にLayoutのBackgroundに書いても適用されません。Themeの設定が後ガチするようですね。

BottomSheetDialogFragmentのデフォルトのThemeをOverrideする方法

まず、Dialogを角丸にするshapeのDrawableリソースを作成します。ここではファイル名をrounded_dialog.xmlにします。

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

次にstyles.xmlにてデフォルトのBottomSheetDialogFragmentのThemeをOverrideします。

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

これで全体に適用されます🙋‍♂️

Themeを新しく作って個別にデザインを適用する方法

全体の方法では、表示する場所によってデザインを変更するなどができません。角を丸くしたくない場合もありますよね。この方法ではそれぞれでThemeを適用できます。

まず、Dialogを角丸にするshapeのDrawableリソースを作成します。ここではファイル名をrounded_dialog.xmlにします(デジャブ)。

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

次にThemeを作成します。この時parentにBottomSheetDialogを指定して継承しています。ThemeとModalStyleの2つ作りましょう。

<!-- Twitter Bottom Sheet Dialog -->
<style name="MyBottomSheetDialogTheme" parent="Theme.Design.Light.BottomSheetDialog">
   <item name="bottomSheetStyle">@style/TwitterModalStyle</item>
</style>
<style name="MyModalStyle" parent="Widget.Design.BottomSheet.Modal">
   <item name="android:background">@drawable/rounded_dialog</item>
</style>

作ったら、BottomSheetDialogFragmentの実装クラスの方で、getTheme() をOverrideして作ったThemeを返すようにします。

class MyDialogFragment : BottomSheetDialogFragment() {
 
   override fun getTheme(): Int {
       return R.style.MyBottomSheetDialogTheme
   }
}

これでOKです。あまり手間も変わりませんし、柔軟性もあるのでこの方法が良さそうですね😍

この記事が気に入ったらサポートをしてみませんか?