외로운 Nova의 작업실

안드로이드 앱 프로그래밍 - 10(다양한 다이얼로그) 본문

Programming/Kotlin - Android

안드로이드 앱 프로그래밍 - 10(다양한 다이얼로그)

Nova_ 2023. 1. 17. 14:45

- 토스트 메시지 띄우기

토스트는 화면 아래쪽에 잠깐 보였다가 사라지는 문자열을 의미합니다. 토스트는 Toast의 makeText()함수로 만듭니다.

open static fun makeText(context: context!, txt: charsequence!, duration: Int): Toast!
open static fun makeText(context: context!, resId: Int, duration: Int): Toast!

 

<토스트 메시지 생성자 예시>

val toast =  Toast.makeText(applicationContext,
	"해당 권한을 허용해주셔야 앱 사용이 가능합니다.", Toast.LENGTH_SHORT).

 

<토스트 메시지 콜백기능>

토스트 메시지가 사라질때 혹은 나타날때 반환되는 콜백함수를 추가할 수 도 있습니다. 이는 API30레벨 버전에서 추가되었습니다. 아래는 예시입니다.

toast.addCallback(
	object: Toast.Callback(){
    	override fun onToastHidden(){    //토스트가 사라지는 순간 콜백함수 정의
        	super.onToastHidden()
            Log.d("log, "Toast Hidden)
        }
        
        override fun onToastShown(){    //토스트가 나타나는 순간 콜백함수 정의
        	super.onToastShown()
            Log.d("log", "Toast shown")
        }
})
toast.show()

 

- 날짜 입력받기

앱에서 사용자에게 날짜나 시간을 입력받는데 사용하는 다이얼로그를 피커라고합니다. 날짜를 입력받을때는 데이트 피커 다일러로그, 시간을 입력받을때는 타임피커 다이얼로그를 사용합니다. 데이트피커 다이얼로그 생성자는 아래와 같습니다.

DatePickerDialog(context: Context, listener: DatePickerDialog.OnDateSetListener?,
	year:Int, month: Int, dayOfMonth: Int)

두번째 매개변수는 콜백함수로 다이얼로그 선택이 완료되면 반환되는 함수를 등록 할 수 있습니다. 아래는 사용 예시입니다. month의 경우에는 0~11의 값을 사용합니다. 0은 1월입니다.

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        //데이트 피커 다이얼로그 사용 예시
        DatePickerDialog(this, object: DatePickerDialog.OnDateSetListener{
            override fun onDateSet(p0: DatePicker?, P1: Int, P2: Int, P3: Int){
                Log.d("log","year : $P1, month : ${P2+1}, dayOfMonth : $P3")
            }
        }, 2020, 8, 21).show()
    }

}

 

- 시간 입력받기

시간을 입력받는 타임 피커 다이얼로그이 생성자는 다음과 같습니다.

TimePickerDialog(context: Context!, listener: TimePickerDialog.OnTimeSetListener!, 
	hourOfDay: Int, minute: Int, is24HourView: Boolean)

2번째 매개변수는 콜백함수이며, is24HoureView는 true값이면 24시간 형태로 출력하고 false값이면 12시간 형태로 출력합니다. 아래는 타임피커 다이얼로그 사용 예시입니다.

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        //타임피커 다이얼로그 사용 예시
        TimePickerDialog(this, object: TimePickerDialog.OnTimeSetListener{
            override fun onTimeSet(p0: TimePicker?, p1: Int, p2: Int) {
                Log.d("log", "time : $p1, minute: %p2")
            }
        }, 15, 0, true).show()
    }

}

 

- 알림창 띄우기

안드로이드 다이얼로그의 기본은 AlertDialog입니다. 데이트피커와 타임피커도 AlertDialog의 하위클래스입니다. 알림창을 생성할때는 빌더라는 인터페이스로 만듭니다. 아래는 빌더입니다.

AlertDialog.Builder(context: Context!)

알림창을 빌드할때는 알림창의 아이콘, 제목, 내용, 버튼등을 설정할 수 있습니다. 이는 인터페이스 함수를 사용하여 설정합니다. 아래는 그의 종류입니다.

아이콘 설정 : open fun setIcon(iconId: Int): AlerDialog.Builder!
제목 설정 : open fun setTitle(title: CharSequence!): AlertDiaglog.Builder!
내용 설정 : open fun setMessage(message: CharSequence!): AlertDialog.Builder!
알림창 긍정버튼 설정 : open fun setPositiveButton(Text: CharSequence!, 
	listener: DialogInterface.OnclickListener!): AlertDialog.Buider!
알림창 부정버튼 설정 : open fun setNegativeButton(Text: CharSequence!, 
	listener: DialogInterface.OnclickListener!): AlertDialog.Buider!
알림창 자연버튼 설정 : open fun setNeutralButton(Text: CharSequence!, 
	listener: DialogInterface.OnclickListener!): AlertDialog.Buider!

 

<알림창 띄우기 예제>

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        //알림창 띄우기 예제
        AlertDialog.Builder(this).run{
            setTitle("test dialog")
            setMessage("정말 종료하시겠습니까?")
            setPositiveButton("OK", null)
            setNegativeButton("No", null)
            setNeutralButton("MORE", null)
            show()

        }
    }

}

 

<목록을 출력하고 하나의 선택을 받는 알림창>

알림창에 목록을 제공하고 하나의 선택을 받는 알림창을 만들때는 setItems 함수를 builder에 포함시킵니다. 아래는 예시입니다.

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val binding = ActivityMainBinding.inflate(layoutInflater)
        val items = arrayOf<String>("사과","복숭아", "수박", "딸기")
        setContentView(binding.root)

        //setItems 콜백 함수
        val callbackFun = object: DialogInterface.OnClickListener{
            override fun onClick(p0: DialogInterface?, p1: Int) {
                Log.d("log", "선택한 과일은 ${items[1]} 입니다.")
            }
        }

        //알림창 띄우기 예제
        AlertDialog.Builder(this).run{
            setTitle("test dialog")
            setItems(items, callbackFun)
            setPositiveButton("OK", null)
            show()

        }
    }

}

 

<목록을 출력하고 여러개 선택을 받는 알림창>

다중선택을 해야할때는 setItems가 아닌 setMultiChoiceItems()함수를 사용합니다. 아래는 사용예시입니다.

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val binding = ActivityMainBinding.inflate(layoutInflater)
        val items = arrayOf<String>("사과","복숭아", "수박", "딸기")
        setContentView(binding.root)

        //setMultiChoiceItems 콜백 함수
        val callbackFun = object: DialogInterface.OnMultiChoiceClickListener{
            override fun onClick(p0: DialogInterface?, p1: Int, p2: Boolean) {
                Log.d("log", "${items[p1]} 이 ${if(p2) "선택되었습니다" else "선택 해제되었습니다."}")
            }
        }

        //알림창 띄우기 예제
        AlertDialog.Builder(this).run{
            setTitle("test dialog")
            setMultiChoiceItems(items, booleanArrayOf(false,false,false,false) ,callbackFun)
            setPositiveButton("OK", null)
            show()

        }
    }

}

 

<다이얼로그 닫기>

뒤로가기 버튼을 눌렀을때나 바깥영역을 터치했을때 다이얼로그가 닫히거나 안닫히게 설정할 수 있습니다. 이는 setCancelable()함수는 뒤로가기버튼을 눌렀을때, setCanceledOnTouchOuside()함수는 바깥영역을 터치했을때를 설정하며 매개변수는 boolean값입니다. true라면 닫고 false라면 닫지않습니다. 아래는 모두 false로 한 예시입니다.

AlertDialog.Builder(this).run{
            setTitle("test dialog")
            setMultiChoiceItems(items, booleanArrayOf(false,false,false,false) ,callbackFun)
            setPositiveButton("OK", null)
            setCancelable(false)
            show()

        }.setCanceledOnTouchOutside(false)

 

- 커스텀 다이얼로그 출력

커스텀 다이얼로그는 XML파일에 커스텀을 하고 이 디자인을 가지고 다이얼로그를 출력합니다. 이때 XML파일을 코드에서 사용해야하기때문에 XML파일 객체를 만드는 초기화과정을 수행해줘야합니다. 하나씩 보겠습니다. 일단 XML파일을 res/rayout 폴더에 dialog_input.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="match_parent">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>
        <RadioGroup
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="horizontal">
            <RadioButton
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="male"/>
            <RadioButton
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="female"/>
        </RadioGroup>
    </LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

이제 코드에 적용합니다.

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val binding = ActivityMainBinding.inflate(layoutInflater)
        val items = arrayOf<String>("사과", "복숭아", "수박", "딸기")
        setContentView(binding.root)

        //xml 초기화
        val dialogBinding = DialogInputBinding.inflate(layoutInflater)
        
        //커스텀 다이얼로그 출력
        AlertDialog.Builder(this).run{
            setTitle("input")
            setView(dialogBinding.root)
            setPositiveButton("닫기", null)
            show()
        }
    }
}

 

Comments