기술적용

custom alertdialog (커스텀 다이얼로그) 구현

131 developer 2022. 4. 28. 10:31

 

5. 커스텀 다이얼로그

 

dialog_page_eidt.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/dialog_background_round"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:text="오늘 몇 페이지까지 읽으셨나요?"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

    <EditText
        android:id="@+id/dialog_page_edit_et"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:hint="오늘까지 읽은 페이지"
        android:inputType="number"
        android:maxLength="5"
        android:textAlignment="center"
        android:layout_marginTop="20dp"
        app:layout_constraintTop_toBottomOf="@id/title"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent" />

    <TextView
        android:id="@+id/dialog_page_end_tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="/ 200 페이지"
        android:layout_marginStart="8dp"
        app:layout_constraintVertical_bias="0.7"
        app:layout_constraintTop_toTopOf="@+id/dialog_page_edit_et"
        app:layout_constraintBottom_toBottomOf="@+id/dialog_page_edit_et"
        app:layout_constraintStart_toEndOf="@+id/dialog_page_edit_et"/>

    <androidx.appcompat.widget.AppCompatButton
        android:id="@+id/dialog_page_cancel_btn"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:background="@drawable/dialog_background_round_left"
        android:text="취소하기"
        android:textColor="@color/white"
        android:textStyle="bold"
        android:layout_marginTop="50dp"
        app:layout_constraintTop_toBottomOf="@+id/dialog_page_end_tv"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toStartOf="@+id/dialog_page_save_btn"/>

    <androidx.appcompat.widget.AppCompatButton
        android:id="@+id/dialog_page_save_btn"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:background="@drawable/dialog_background_round_right"
        android:text="저장하기"
        android:textColor="@color/white"
        android:textStyle="bold"
        app:layout_constraintTop_toTopOf="@+id/dialog_page_cancel_btn"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toEndOf="@+id/dialog_page_cancel_btn"
        app:layout_constraintEnd_toEndOf="parent"/>
        
</androidx.constraintlayout.widget.ConstraintLayout>

 

 

구현

            val dialogView = layoutInflater.inflate(R.layout.dialog_page_eidt, null)
            val alertDialog = AlertDialog.Builder(this)
                    .setView(dialogView)
                    .create()

            val userName = dialogView.findViewById<EditText>(R.id.username).text
            val password = dialogView.findViewById<EditText>(R.id.password).text
            val button = dialogView.findViewById<MaterialButton>(R.id.button)

            button.setOnClickListener {
                alertDialog.dismiss()
                Log.d("MyTag", "userName : $userName, password : $password")
            }

            alertDialog.show()

 

 

같은 기능 다른 코드

            AlertDialog.Builder(this)
                    .setView(R.layout.dialog_page_eidt)
                    .show()
                    .also { alertDialog ->

                        if(alertDialog == null) {
                            return@also
                        }

                        val userName = alertDialog.findViewById<EditText>(R.id.username)?.text
                        val password = alertDialog.findViewById<EditText>(R.id.password)?.text
                        val button = alertDialog.findViewById<MaterialButton>(R.id.button)

                        button?.setOnClickListener {
                            alertDialog.dismiss()
                            Log.d("MyTag", "userName : $userName, password : $password")
                        }
                    }

 

 

AlertDialog.java 클래스에서 show() 함수는 아래와 같기 때문에 create를 해주지 않아도 자동으로 생성

        public AlertDialog show() {
            final AlertDialog dialog = create();
            dialog.show();
            return dialog;
        }

 

 

 

 

테두리 둥글게 만들기

dialog_background_round.xml

<?xml version="1.0" encoding="utf-8"?>
<!-- 다이얼로그 배경 -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content">
    <item>
        <!-- 사각형 지정 -->
        <shape android:shape="rectangle">
            <!-- 각 모서리 dip 만큼 코너형식 -->
            <corners android:radius="18dip" />
            <!-- 배경색 -->
            <solid android:color="#fff" />
            <!-- 라인색 및 두께 -->
            <stroke android:width="0dp" android:color="#ff0000"/>
        </shape>
    </item>
</layer-list>

 

backgound에 적용

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/dialog_background_round"
    xmlns:app="http://schemas.android.com/apk/res-auto">

 

 

커스텀 다이얼로그 띄우는 메소드에 코드 작성

public void showDialog()
    {
        final Dialog dialog = new Dialog(context);
        // 아래 코드를 꼭 적어준다
        dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        .
        .
        .
    }

 

 

참고

https://greedy0110.tistory.com/70

 

Android Custom Dialog 만들기, Fullscreen Dialog 만들기, Transparent Dialog 만들기

무엇을 원하는가? 완전 커스텀한 뷰의 Dialog 전면을 다 차지하는 Dialog 단계별로 따라 하기 1. AlertDialog 사용하기 Dialog를 띄우는 가장 쉬운 방법은 AlertDialog.Builder가 제공하는 기능만 사용하는 것입

greedy0110.tistory.com