Bottom Sheet Dialog 구현하기

김명진·2021년 7월 23일
3

안드로이드

목록 보기
21/25
post-custom-banner

안드로이드에서 Bottom Sheet Dialog를 구현해보도록 하자. Bottom Sheet Dialog는 Bottom Sheet과는 다른 형식이다. 이름에서 알고 있듯이 마치 dialog를 띄우는 방식이다.

레이아웃 정의하기

우선 원하는 bottom sheet layout xml 파일부터 만든다.

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/bottomSheetDashBoardLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:behavior_hideable="true"
    app:behavior_draggable="true"
    app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="400dp"
        android:text="bottomSheet Dialog"
        android:gravity="center"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"/>


</androidx.constraintlayout.widget.ConstraintLayout>

예시에서는 간단한 텍스트파일을 띄우기로 해보자. 그리고 해당 라인을 추가한다.

app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior"

  • app:behavior_peekHeight을 통해 기본 높이를 설정할 수 있습니다.
  • app:behavior_hideable는 dialog를 화면에 고정할지 안할지 정하는 조건이다.
    * 항상 표시하는 경우는 peekHeight만큼 높이를 갖는다.
  • app:behavior_draggable는 사용자가 dialog의 높이를 손가락으로 조절할 수 있게 해주는 조건이다.

Activity 또는 Fragment 정의하기

다음과 같이 정의해주면 된다. 정의가 되면 show()를 통해 bottomSheetDialog를 띄울수있다.


class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val bottomSheetView = layoutInflater.inflate(R.layout.bottom_sheet_layout, null)
        val bottomSheetDialog = BottomSheetDialog(this)
        bottomSheetDialog.setContentView(bottomSheetView)

        findViewById<Button>(R.id.button).setOnClickListener {
            bottomSheetDialog.show()
        }
    }
}

또한 setState를 통해 BottomSheet의 State을 변경할 수 있습니다. 명령어는 다음과 같다:
bottomSheetDialog.behavior.state = BottomSheetBehavior.STATE_HALF_EXPANDED

State 변경은 다음과 같다:

  • STATE_COLLAPSED : height 만큼 보이게 됩니다.
  • STATE_EXPANDED : 가득 차게 처리합니다.
  • STATE_HIDDEN : 숨김 처리됩니다.

BottomSheet corner 변경하기

bottom sheet의 style를 변경하면 위와 같이 corner를 변경할 수 있다.

우선 원하는 모양을 정의해주고 drawable에 저장해준다. 여기서는 bottom_sheet_background로 정의해주도록 하겠다.

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

다음으로 style 또는 theme를 변경해주면 된다.

<resources xmlns:tools="http://schemas.android.com/tools">
    <!-- Base application theme. -->
    <style name="Theme.MyApplication" parent="Theme.MaterialComponents.DayNight.NoActionBar">
        <!-- Primary brand color. -->
        <item name="colorPrimary">@color/purple_500</item>
		...
        <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/bottom_sheet_background</item>
    </style>
</resources>
profile
꿈꾸는 개발자
post-custom-banner

0개의 댓글