[안드로이드 프로그래밍] Android Message

PUJIN·2023년 7월 4일
0

android programming

목록 보기
18/26
post-thumbnail

📌 Toast

일정 시간이 지나면 자동으로 사라지는 메세지
화면과 관련 없이 안드로이드 OS에 메세지 출력 요청 후 안드로이드 OS에 의해 나타나는 메세지 (어플리케이션과의 관계 X)

  • 항상 화면을 보고있는 경우 사용
  • 요청한 순서대로 메세지 출력

주요 메서드

  • makeText : toast 메세지 객체 생성
val t1 = Toast.makeText(this@MainActivity,"toast message",Toast.LENGTH_SHORT)
  • show : toast 메세지 표시
t1.show()
  • callback
    • onToastHidden : toast 메세지가 사라질 때 호출
    • onToastShown : toast 메세지가 나타날 때 호출
      * 안드로이드 11 (API 30)부터 사용 가능
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
	t1.addCallback(object:Toast.Callback(){
		override fun onToastShown() {
			super.onToastShown()
		}
		override fun onToastHidden() {
			super.onToastHidden()
		}
	})
}

toast 커스터마이징

  • viewBinding 객체 생성
val toastBinding = ToastBinding.inflate(layoutInflater)

toastBinding.run {
	val t1 = Toast(this@MainActivity)
}
  • setBackgroundResource : 배경 설정
toastBinding.root.setBackgroundResource(android.R.drawable.screen_background_dark)
  • setTextColor : 텍스트 색상 설정
textView.setTextColor(Color.WHITE)
  • setGravity : toast 메세지가 표시될 위치 설정
t1.setGravity(Gravity.CENTER,0,200)
  • setView : toast 메세지를 통해 보여줄 view 설정
t1.view = toastBinding.root
  • setDuration : 메세지가 표시될 시간 설정
t1.duration = Toast.LENGTH_LONG



📌 SnackBar

activity 위에 표시되며 하단에 나타나는 메세지

  • 버튼 배치 가능

주요 메서드

  • SnackBar.make : snackBar 객체 생성
    • LENGTH_SHORT : 안드로이드에서 정한 짧은 시간동안 작동
    • LENGTH_LONG : 안드로이드에서 정한 긴 시간동안 작동
    • LENGTH_INDEFINITE : 사라지지 않고 계속 작동
snackBar1 = Snackbar.make(it, "snackBar message", Snackbar.LENGTH_INDEFINITE)
  • show : snackBar 메세지 표시
snackBar1.show()
  • dismiss : snackBar 메세지 사라지기
    • isInitialized: 초기화 되어있는지 확인
    • isShown : 보여지고 있는지 확인
// snackBar1 변수가 초기화 되어있는 경우
if(::snackBar1.isInitialized){
	// 보여지고 있는 경우
	if(snackBar1.isShown){
		snackBar1.dismiss()
	}
}
  • callback
    • onDismissed : snackBar가 사라질 때 호출
    • onShown : snackBar가 나타날 때 호출
snackBar1.addCallback(object : BaseTransientBottomBar.BaseCallback<Snackbar>(){
	override fun onShown(transientBottomBar: Snackbar?) {
		super.onShown(transientBottomBar)
	}

	override fun onDismissed(transientBottomBar: Snackbar?, event: Int) {
		super.onDismissed(transientBottomBar, event)
	}
})
  • setTextColor : 표시되는 메세지 색상 설정
snackBar1.setTextColor(Color.RED)
  • setBackgroundTint : 배경 색상 지정
snackBar1.setBackgroundTint(Color.BLUE)
  • setAnimationMode : 나타나거나 사라질 때 애니메이션 설정
    • ANIMATION_MODE_SLIDE, ANIMATION_MODE_FADE ...
snackBar1.animationMode = Snackbar.ANIMATION_MODE_SLIDE
  • setAction : 클릭하면 이벤를 처리할 수 있는 요소 설정
    • 1개만 설정 가능
    • 선택한 경우 : action 기능 + 사라진다.
snackBar1.setAction("Action1"){
	activityMainBinding.textView.text = "action1 click"
}

snackBar 커스터마이징

  • viewBinding 객체 생성
val snackBar1 = Snackbar.make(it, "Custom SnackBar", Snackbar.LENGTH_SHORT)

val snackbarBinding = SnackbarBinding.inflate(layoutInflater)
  • 각각의 view 설정
 snackbarBinding.run{
 	imageView.setImageResource(R.drawable.img_android)
	textView.text = "View"
	textView.setTextColor(Color.WHITE)
}
  • layout을 추출하여 새로운 view 추가
    • snackBar는 새로운 view를 설정하는 메서드나 프로퍼티 X
    • 추가하지 않을 경우 snackBar의 view 표시 X, 사용 불가
val snackBarLayout = snackBar1.view as Snackbar.SnackbarLayout
snackBarLayout.addView(snackbarBinding.root)



📌 Dialog

activity 위에 나타나는 메세지
메세지 전달이나 입력 등의 용도로 사용하는 메세지

  • 사용자가 무조건 봐야하는 경우 사용
  • dialog가 나타나있는 경우에는 주변 view 사용 불가 (일시정지)
  • 최대 3개의 버튼 배치 가능

주요 메서드

  • 객체 생성
val builder = AlertDialog.Builder(this@MainActivity)
  • show : Dialog 표시
builder.show()
  • setTitle : 타이틀 설정
builder.setTitle("Dialog")
  • setMessage : 메세지 설정
builder.setMessage("message")
  • setIcone : 아이콘 설정
builder.setIcon(R.mipmap.ic_launcher)
  • 버튼 배치
    • setPositiveButton : positive 자리에 버튼 배치
    • setNegativeButton : negative 자리에 버튼 배치
    • setNeutralButton : neutral 자리에 버튼 배치
      • null : 버튼 클릭시 dialog 사라진다.
      • 동작하지 않고 사라지기만 하면 되는 경우 : Listener 세팅 필요 X
builder.setPositiveButton("Positive", null)
builder.setPositiveButton("Positive"){ dialogInterface: DialogInterface, i: Int ->
	textView.text = "Positive button click"
}


Dialog 커스터마이징

  • viewBinding 객체 생성
val dialogBinding = DialogBinding.inflate(layoutInflater)

val builder = AlertDialog.Builder(this@MainActivity)
  • setView : 새로운 view 설정
builder.setView(dialogBinding.root)
  • setButton : 해당 위치에 버튼 배치
    • dialogInterface : 사용자가 버튼을 누른 dialog 객체
builder.setPositiveButton("확인", ) { dialogInterface: DialogInterface, i: Int -> }
builder.setNegativeButton("취소", null)

DatePicker

날짜를 선택할 수 있게 하기 위해 사용하는 dialog

  • 날짜 가져오기
val calendar = Calendar.getInstance()

val year = calendar.get(Calendar.YEAR)
val month = calendar.get(Calendar.MONTH)
val day = calendar.get(Calendar.DAY_OF_MONTH)
  • OnDateSetListener : 날짜 선택시 동작하는 리스너
    • onDateSet : '확인' 선택시 동작하는 함수
      • p1: Int : 년
      • p2: Int : 월
        • month : 0부터 시작
          → 사용자에게 출력하는 경우 : (+1)
          → 코드에서 사용하는 경우 : 그대로 사용
      • p3: Int : 일
val datePickerListener = object : DatePickerDialog.OnDateSetListener{
	override fun onDateSet(p0: DatePicker?, p1: Int, p2: Int, p3: Int) {
		textView.text = "${p1}${p2+1}${p3}일"
	}
}
  • dialog 설정
val pickerDialog = DatePickerDialog(this@MainActivity, datePickerListener, year, month, day)

pickerDialog.show()

TimePicker

시간을 선택할 수 있게 하기 위해 사용하는 dialog

  • 시간 가져오기
val calendar = Calendar.getInstance()

val hour = calendar.get(Calendar.HOUR)
val minute = calendar.get(Calendar.MINUTE)
  • OnTimeSetListener : 시간 선택시 동작하는 리스너
    • onTimeSet : '확인' 선택시 동작하는 함수
      • p1: Int : 시간
      • p2: Int : 분
val timePickerListener = object : TimePickerDialog.OnTimeSetListener{
	override fun onTimeSet(p0: TimePicker?, p1: Int, p2: Int) {
		textView.text = "${p1}${p2}분"
	}
}
  • dialog 설정
    • true : 24시간제
    • false : 12시간제
val pickerDialog = TimePickerDialog(this@MainActivity, timePickerListener, hour, minute, true)

pickerDialog.show()

ListDialog

listView를 표시할 수 있는 dialog

  • listView 설정
val dataList = arrayOf(
        "항목1", "항목2", "항목3", "항목4", "항목5", "항목6",
        "항목7", "항목8", "항목9", "항목10", "항목11", "항목12",
        "항목13", "항목14", "항목15", "항목16", "항목17", "항목18"
)
    
val adapter = ArrayAdapter<String>(
	this@MainActivity, android.R.layout.simple_list_item_1, dataList
)
  • 객체 생성
val builder = AlertDialog.Builder(this@MainActivity)
  • adapter 설정
    • 항목을 선택한 경우 : 리스너 처리 + 다이얼로그 사라진다.
    • i : 사용자가 선택한 항목의 순서값
builder.setAdapter(adapter){ dialogInterface: DialogInterface, i: Int ->
	textView.text = "${dataList[i]}"
}
  • setButton : 해당 위치에 버튼 배치
builder.setNegativeButton("취소", null)

다중선택 Dialog

체크박스 형태를 제공하는 dialog

  • 데이터 list 설정
val dataList = arrayOf(
        "항목1", "항목2", "항목3", "항목4", "항목5", "항목6",
        "항목7", "항목8", "항목9", "항목10", "항목11", "항목12",
        "항목13", "항목14", "항목15", "항목16", "항목17", "항목18"
)

// 모두 false로 설정
val mutilChoiceList = BooleanArray(dataList.size){i -> false}
  • 객체 생성
val builder = AlertDialog.Builder(this@MainActivity)
  • setMultiChoiceItems : 마지막 매개변수에 체크 상태가 변경되었을 때 동작하는 리스너 설정
    • 누를 때마다 갱신
      • 체크 상태가 변경된 항목의 체크 상태 값으로 BooleanArray 변경
builder.setMultiChoiceItems(dataList, mutilChoiceList){ dialogInterface: DialogInterface, i: Int, b: Boolean ->
	mutilChoiceList[i] = b
}
  • setButton : 해당 위치에 버튼 배치
builder.setNegativeButton("취소", null)
builder.setPositiveButton("확인", ){ dialogInterface: DialogInterface, i: Int ->
	textView.text = ""

	for(idx in 0 until mutilChoiceList.size){
		if(mutilChoiceList[idx] == true){
			textView.append("${dataList[idx]}\n")
		}
	}
}



📌 Notification

알림창에 표시되는 메세지


권한 설정

안드로이드 버전 13 이후 : notification 사용시 POST_NOTIFICATIONS 권한을 사용자로부터 확인 받는다.

  • AndroidManifest.xml
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
  • permission list 생성
    • Manifest(android) 선택
val permissionList = arrayOf(
	Manifest.permission.POST_NOTIFICATIONS
)
  • 권한 확인 요청
requestPermissions(permissionList, 0)

주요 메서드

  • addNotificationChannel : notification channel을 등록하는 메서드
    • id : 코드에서 채널을 관리하기 위한 이름
    • name : 사용자에게 노출 시킬 이름
fun addNotificationChannel(id:String, name:String){
	// 안드로이드 8.0 이상일 때만 동작
	if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
		// 알림 메시지를 관리하는 객체 추출
		val notificationManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
		// id를 통해 NotificationChannel 객체 추출
		// 채널이 등록된 적이 없는 경우 : null 반환
		val channel = notificationManager.getNotificationChannel(id)
        // 채널이 등록된 적이 없는 경우
		if(channel == null){
			// 채널 객체 생성
			val newChannel = NotificationChannel(id, name, NotificationManager.IMPORTANCE_HIGH)
			// 단말기에 LED 램프가 있다면 램프를 사용하도록 설정
			newChannel.enableLights(true)
			// LED 램프의 색상 설정
			newChannel.lightColor = Color.RED
			// 진동 사용 설정
			newChannel.enableVibration(true)
			// 채널 등록
			notificationManager.createNotificationChannel(newChannel)
		}
	}
}
  • notification 채널 등록
// Notification Channel을 코드에서 구분하기 위한 이름 설정
val NOTIFICATION_CHANNEL1_ID = "CHANNEL1"
val NOTIFICATION_CHANNEL2_ID = "CHANNEL2"
// 사용자게 노출 시킬 채널의 이름 설정
val NOTIFICATION_CHANNEL1_NAME = "첫 번째 채널"
val NOTIFICATION_CHANNEL2_NAME = "두 번째 채널"

addNotificationChannel(NOTIFICATION_CHANNEL1_ID, NOTIFICATION_CHANNEL1_NAME)
addNotificationChannel(NOTIFICATION_CHANNEL2_ID, NOTIFICATION_CHANNEL2_NAME)
  • getNotificationBuilder : notification 메시지 관리 객체를 생성하는 메서드
    • id : notification 채널 ID
fun getNotificationBuilder(id:String) : NotificationCompat.Builder{
	// 안드로이드 8.0 이상일 때만 동작
	if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
		val builder = NotificationCompat.Builder(this, id)
		return builder
	} else {
		val builder = NotificationCompat.Builder(this)
		return builder
	}
}
  • NotificationBuilder 가져오기
val builder = getNoficationBuilder(NOTIFICATION_CHANNEL1_ID)
  • 메시지 객체 생성
val notification = builder.build()
  • 알림 메세지 관리하는 객체 추출
val notificationManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
  • notify : 메세지 표시
    • 첫번째 매개변수 : 단말기 전체에서 메세지를 구분하는 값
      • 값은 값으로 메세지를 계속 설정한 경우 : 메세지 갱신
      • 다른 값으로 메세지를 설정한 경우 : 각각 다른 메세지 표시
notificationManager.notify(10, notification)

주요 속성

  • setSmallIcon : 작은 아이콘 설정
builder.setSmallIcon(android.R.drawable.ic_menu_search)
  • setLargeIcon : 큰 아이콘 설정
val bitmap = BitmapFactory.decodeResource(resources, R.mipmap.ic_launcher)
builder.setLargeIcon(bitmap)
  • setNumber : 숫자 설정
builder.setNumber(100)
  • setContentTitle : 타이틀 설정
builder.setContentTitle("Content Title")
  • setContentText : 메시지 설정
builder.setContentText("Content Text")


⌨️ 전체 코드

addNotificationChannel(NOTIFICATION_CHANNEL1_ID, NOTIFICATION_CHANNEL1_NAME)
addNotificationChannel(NOTIFICATION_CHANNEL2_ID, NOTIFICATION_CHANNEL2_NAME)

activityMainBinding.run{
	button.setOnClickListener {
		val builder = getNoficationBuilder(NOTIFICATION_CHANNEL1_ID)
             
		builder.setSmallIcon(android.R.drawable.ic_menu_search)

		val bitmap = BitmapFactory.decodeResource(resources, R.mipmap.ic_launcher)
		builder.setLargeIcon(bitmap)
               
		builder.setNumber(100)
                
		builder.setContentTitle("Content Title")

		builder.setContentText("Content Text")

        val notification = builder.build()
             
		val notificationManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
               
		notificationManager.notify(10, notification)
	}
}
fun addNotificationChannel(id:String, name:String){
	if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
    
		val notificationManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
        
		val channel = notificationManager.getNotificationChannel(id)
         
		if(channel == null){
        
			val newChannel = NotificationChannel(id, name, NotificationManager.IMPORTANCE_HIGH)
                
			newChannel.enableLights(true)
       
			newChannel.lightColor = Color.RED

			newChannel.enableVibration(true)
     
			notificationManager.createNotificationChannel(newChannel)
		}

	}
}


fun getNoficationBuilder(id:String) : NotificationCompat.Builder{
	if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
		val builder = NotificationCompat.Builder(this, id)
		return builder
	} 
    
    else {
		val builder = NotificationCompat.Builder(this)
		return builder
	}
}

0개의 댓글