티스토리 뷰
앱개발 숙련 1주차 정리 - 3
다이얼로그
다이얼로그란?
사용자가 추가정보를 입력하거나 결정을 내리게 할 때 쓰이는 작은 창이다.
일반적으로 모달 형태로 나타나서 사용자가 다른 작업을 하기 전에
해당 다이얼로그에서 요구하는 작업을 완료하도록 유도한다.
다이얼로그 구조
다이얼로그는 제목(1), 콘텐츠 영역(2), 작업 버튼(3)으로 이루어져있다.
제목은 선택사항으로 단순 메시지나 질문을 하는 경우에는 없어도 된다.
대화 상자 하나에 작업 버튼은 3개를 초과해서는 안된다.
다이얼로그 예제
각 버튼을 누르면 해당하는 다이얼로그를 띄운다.
기본 다이얼로그
binding.btn1Alert.setOnClickListener {
// 다이얼로그 생성
val builder = AlertDialog.Builder(this)
// 다이얼로그 UI 설정
builder.setTitle("기본 다이얼로그 타이틀")
builder.setMessage("기본 다이얼로그 메세지")
builder.setIcon(R.mipmap.ic_launcher)
// 선택한 작업 버튼에 따른 동작 정의
val listener = object : DialogInterface.OnClickListener {
override fun onClick(p0: DialogInterface?, p1: Int) {
when (p1) {
DialogInterface.BUTTON_POSITIVE ->
binding.tvTitle.text = "예 선택"
DialogInterface.BUTTON_NEGATIVE ->
binding.tvTitle.text = "아니오 선택"
DialogInterface.BUTTON_NEUTRAL ->
binding.tvTitle.text = "보류 선택"
}
}
}
// 다이얼로그 작업 버튼 텍스트 설정
builder.setPositiveButton("예", listener)
builder.setNegativeButton("아니오", listener)
builder.setNeutralButton("보류", listener)
builder.show() // 다이얼로그 띄우기
}
기본 다이얼로그를 띄우는 예제이다.
AlertDialog 클래스를 이용해 다이얼로그를 생성한다.
다이얼로그에 보류(Netural) 버튼이 있다는 걸 오늘 처음 알았다.
커스텀 다이얼로그
dialog.xml 파일 만들어서 다이얼로그 콘텐츠 영역에 들어갈 레이아웃을 작성한다.
private fun btn2Dialog(){
binding.btn2Custom.setOnClickListener {
val builder = AlertDialog.Builder(this)
builder.setTitle("커스텀 다이얼로그")
builder.setIcon(R.mipmap.ic_launcher)
// 만들어둔 레이아웃을 다이얼로그의 콘텐츠 영역으로 설정
val v1 = layoutInflater.inflate(R.layout.dialog, null)
builder.setView(v1)
// id로 레이아웃의 뷰들을 가져와 활용한다.
val listener = DialogInterface.OnClickListener { p0, p1 ->
val alert = p0 as AlertDialog
val edit1: EditText? = alert.findViewById(R.id.editText)
val edit2: EditText? = alert.findViewById(R.id.editText2)
binding.tvTitle.text = "이름 : ${edit1?.text}"
binding.tvTitle.append(" / 나이 : ${edit2?.text}")
}
// 아무런 동작도 하지 않게 하려면 리스너를 null로 준다.
builder.setPositiveButton("확인", listener)
builder.setNegativeButton("취소", null)
builder.show()
}
}
setView로 콘텐츠 영역을 설정해 다이얼로그를 커스텀할 수 있다.
리스너 정의 구문에서 p0은 클릭된 다이얼로그 인터페이스에 해당하며,
p0를 AlertDialog로 캐스팅하여 다이얼로그 내부의 뷰에 접근할 수 있도록 한다.
텍스트뷰의 텍스트를 지정하고 append 메소드를 통해 문자열을 추가할 수 있다.
다이얼로그를 커스텀하여 콘텐츠 영역을 원하는대로 채울 수 있으며
콘텐츠 레이아웃의 뷰를 가져와 상호작용을 하는 것도 가능하다.
날짜 다이얼로그
binding.btn3Date.setOnClickListener {
val calendar = Calendar.getInstance()
val year = calendar.get(Calendar.YEAR)
val month = calendar.get(Calendar.MONTH)
val day = calendar.get(Calendar.DAY_OF_MONTH)
val listener = DatePickerDialog.OnDateSetListener { datePicker, i, i2, i3 ->
binding.tvTitle.text = "${i}년 ${i2 + 1}월 ${i3}일"
}
var picker = DatePickerDialog(this, listener, year, month, day)
picker.show()
}
달력 인스턴스를 생성한 후 오늘날짜를 날짜 선택 다이얼로그에 지정한다.
DatePickerDialog는 달력을 띄워 날짜를 선택하도록 한다.
시간 다이얼로그
binding.btn4Time.setOnClickListener {
val calendar = Calendar.getInstance()
val hour = calendar.get(Calendar.HOUR)
val minute = calendar.get(Calendar.MINUTE)
val listener = TimePickerDialog.OnTimeSetListener { timePicker, i, i2 ->
binding.tvTitle.text = "${i}시 ${i2}분"
}
val picker = TimePickerDialog(this, listener, hour, minute, false)
picker.show()
}
시간 선택 다이얼로그 만드려면 마찬가지로 달력에서 현재 시간 가져오고
TimePickerDialog에 현재 시간 설정해주면 된다.
TimePickerDialog의 마지막 인자값을 true로 주면 24시간 표기법으로 바뀐다.
진행 다이얼로그
프로그래스바 레이아웃을 하나 만들어준다.
binding.btn5Porgress.setOnClickListener {
val builder = AlertDialog.Builder(this)
builder.setTitle("프로그래스바")
builder.setIcon(R.mipmap.ic_launcher)
val v1 = layoutInflater.inflate(R.layout.progressbar, null)
builder.setView(v1)
builder.show()
}
프로그래스바 레이아웃을 콘텐츠 영역에 넣는다.
시간이 걸리는 작업을 해야할 때 사용되는 다이얼로그다.
알림
알림이란?
앱의 UI와 별도로 사용자에게 앱과 관련한 정보를 보여주는 기능이다.
앱에서 알림을 보내면 단말기 상단 부분에 설정한 아이콘으로 표시된다.
알림을 터치하여 해당 앱을 열 수 있고, 간단한 작업 또한 가능하다.
알림 중요도
알림 중요도를 통해 알림의 노출 정도를 설정한다.
notification()
fun notification() {
// notification 매니저와 빌더 설정
val manager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
val builder: NotificationCompat.Builder
// 안드로이드 버전이 8.0이상이면 채널을 만들어야 함
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
// 채널 설정 (아이디, 이름, 중요도)
val channelId = "one-channel"
val channelName = "My Channel One"
val channel = NotificationChannel(
channelId,
channelName,
NotificationManager.IMPORTANCE_DEFAULT
).apply {
// 채널에 다양한 정보 설정
description = "My Channel One Description" // 채널 설명
setShowBadge(true) // 알림 개수 띄우기
val uri: Uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)
val audioAttributes = AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
.setUsage(AudioAttributes.USAGE_ALARM)
.build()
setSound(uri, audioAttributes) // 알림 소리 설정
enableVibration(true) // 진동 여부 설정
}
// 채널을 NotificationManager에 등록
manager.createNotificationChannel(channel)
// 채널 아이디를 통해 builder 생성
builder = NotificationCompat.Builder(this, channelId)
} else {
// 버전이 8.0 미만일 때는 채널을 생성하지 않음
builder = NotificationCompat.Builder(this)
}
// 알림에 뜰 이미지
val bitmap = BitmapFactory.decodeResource(resources, R.drawable.flower)
// 알림의 버튼을 누르면 하는 동작 정의
val intent = Intent(this, SecondActivity::class.java)
// PendingIntent는 알림에서 특정 액티비티를 시작하는 데 사용됨
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
val pendingIntent = PendingIntent.getActivity(
this,
0,
intent,
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
)
// 알림 설정
builder.run {
setSmallIcon(R.mipmap.ic_launcher) // 아이콘 설정
setWhen(System.currentTimeMillis()) // 알림 발생시간은 현재로 설정
setContentTitle("새로운 알림입니다.") // 알림 제목 설정
setContentText("알림이 잘 보이시나요.") // 알림 내용 설정
// setStyle(
// // 알림 내용으로 긴 글자 띄우기
// NotificationCompat.BigTextStyle()
// .bigText("이것은 긴텍스트 샘플입니다. 아주 긴 텍스트를 쓸때는 여기다 하면 됩니다.이것은 긴텍스트 샘플입니다. 아주 긴 텍스트를 쓸때는 여기다 하면 됩니다.이것은 긴텍스트 샘플입니다. 아주 긴 텍스트를 쓸때는 여기다 하면 됩니다.")
// )
// 알림 내용으로 이미지 띄우기
setStyle(NotificationCompat.BigPictureStyle().bigPicture(bitmap))
setLargeIcon(bitmap) // 우측에 뜨는 큰 아이콘 설정
addAction(R.mipmap.ic_launcher, "Action", pendingIntent) // 버튼 눌렀을 때 동작 정의
}
manager.notify(11, builder.build()) // 알림 호출
}
해당 함수를 호출하여 휴대폰에 현재 실행하고 있는 앱의 알림을 보낼 수 있다.
notification 메소드는 알림 채널과 알림의 정보를 설정하고 manager.notify를 호출해 푸쉬 알림을 보낸다.
권한 요청
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapp">
<!-- API 33 이상을 위한 알림 권한 추가 -->
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
...
</manifest>
API 레벨 33 이상일 떄는 매니패스트에 알림 권한을 추가해줘야한다.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
if (!NotificationManagerCompat.from(this).areNotificationsEnabled()) {
// 알림 권한이 없다면, 사용자에게 권한 요청
val intent = Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS).apply {
putExtra(Settings.EXTRA_APP_PACKAGE, packageName)
}
startActivity(intent)
}
}
앱이 실행 중일 때 사용자에게 알림 권한을 요청하기 위한 코드이다.
알림 권한이 없다면 알림 설정 화면으로 이동하는 로직이다.
'내일배움캠프 > Android 국비지원' 카테고리의 다른 글
TIL 47일차 (앱개발 숙련 개인 과제 - 레이아웃 구현) (0) | 2024.07.29 |
---|---|
TIL 46일차 (챌린지반 4주차 세션 정리 및 첫번째 과제) (0) | 2024.07.29 |
TIL 44일차 (앱개발 숙련 1주차 정리 - 2) (1) | 2024.07.22 |
TIL 43일차 (앱개발 숙련 1주차 정리 - 1) (0) | 2024.07.13 |
TIL 42일차 (챌린지반 3주차 세션 과제) (0) | 2024.07.12 |