뷰 바인딩 View Binding
모듈에 있는 각 XML 레이아웃 파일의 결합 클래스를 생성. 레이아웃 파일의 이름을 기반으로 한 바인딩 클래스를 자동생성. 인스턴스는 해당 레이아웃에 ID가 있는 모든 뷰의 직접 참조 포함
findViewById와 비교
Null 안전성 Null Safety
앱이 레이아웃의 각 뷰를 직접 참조할 수 있게 해주는 안전한 코드를 자동으로 생성
null로 인한 오류, 즉 뷰가 아직 화면에 나타나지 않았는데 그 뷰를 사용하려고 할 때 생길 수 있는 문제들을 예방
레이아웃에 버튼이 있어야 하는데 아직 버튼이 생성되지 않았다 -> 안전하게 처리
레이아웃의 일부만 뷰가 있다 -> 해당 뷰가 '가능성 있는 null'(Nullable)임을 알림
타입 안전성 Type Safety
뷰의 타입과 바인딩 클래스의 필드 타입이 항상 일치
이미지 뷰(ImageView)에 텍스트를 설정하려고 하면 오류가 발생하지만 뷰 바인딩이 이미지 뷰는 이미지 뷰로, 텍스트 뷰는 텍스트 뷰로만 사용되게 하여 잘못된 타입 사용으로 인한 오류가 발생하지 않도록 보장
프래그먼트에서 주의사항
프래그먼트는 재사용을 대비해서 LifeCycle onDestroyView()가 호출되면 프래그먼트에 대한 레퍼런스는 존재하지 않지만 내부적으로 뷰를 재사용하기 위해 보관하는데 프래그먼트의 생명주기는 뷰보다 더 오래 유지되므로 메모리 누수 방지를 위해 onDestroyView() 호출 시 binding 객체를 null로 만들어 GC에서 수집하도록해야함
어댑터 뷰 Adapter View
여러개의 항목을 다양한 형식으로 나열하고 선택 할 수 있는 기능을 제공하는 뷰
표시할 항목 데이터를 직접 관리하지 않고 어댑터 객체로부터 공급
데이터를 관리하며 데이터 원본과 어댑터뷰 사이의 중계 역할
정의된 인터페이스를 바탕으로 필요한 정보를 요청하여 항목뷰를 화면에 표시하거나 선택된 항목뷰를 처리
사용자가 어댑터뷰의 특정 위치의 항목을 선택하였을 때 어댑터뷰는 선택된 항목, 항목ID, 항목뷰를 어댑터의 getItem(), getItemId(), getView() 메소드를 통해 얻어와서 이를 항목선택 이벤트 처리기에 넘겨준다.
getCount() : 표시할 항목의 총 개수
getView() : 화면에 실제로 표시할 항목뷰
어댑터 종류
- BaseAdapter : 어댑터 클래스의 공통 구현, 사용자 정의 어댑터 구현 시 사용
- ArrayAdapter : 객체 배열, 리소스에 정의된 배열로부터 데이터를 공급받음
- CursorAdapter : 데이터베이스로부터 데이터를 공급받음
- SimpleAdapter : 데이터를 Map(키,값)의 리스트로 관리, 데이터를 XML파일에 정의된 뷰에 대응시키는 어댑터
어댑터뷰 종류
- 리스트뷰 ListView : 항목을 수직으로 나열시키는 방식
- 그리드뷰 GridView : 항목을 격자 형태로 나열시키는 방식
RecyclerView
여러 아이템을 스크롤 가능한 리스트로 표현하여 효율적으로 관리하고 보여주는 위젯
View를 재활용해서 한정적인 화면에 많은 데이터를 넣을 수 있다.
ListView와 비교
리스트뷰는 사용자가 스크롤 할 때마다 위에 있던 아이템은 삭제되고 맨 아래의 아이템은 생성 되길 반복
계속 삭제와 생성을 반복하므로 성능에 좋지 않다.
리사이클뷰는 사용자가 스크롤 할 때, 위에 있던 아이템이 아래로 이동하여 재사용
View를 계속 만드는 ListView의 단점을 보완하기 위해 나왔다.
아이템이 100개일 때 리스트뷰는 100개 생성 삭제, 리사이클뷰는 10개정도의 View만 만들고 재활용해서 사용
Adapter와 ViewHolder
Adapter : 데이터와 RecyclerView 사이의 통신을 위한 연결체
ViewHolder : 화면에 표시될 데이터나 아이템들을 저장하는 역할. 위로 올라간 View를 재활용하기 위해서 이 View를 기억하고 있어야 한다.
섬세하고 똑똑한 팀원분께서 직접 만들주신 리사이클러뷰 자료
허락받고 공유!
https://jaeseonyoo.tistory.com/
프래그먼트 Fragment
액티비티 위에서 동작하는 모듈화된 사용자 인터페이스
액티비티와 분리되어 독립적으로 동작할 수 없다.
여러 개의 프래그먼트를 하나의 액티비티에 조합하여 창이 여러 개인 UI 구축 가능. 하나의 프래그먼트를 여러 액티비티에서 재사용 가능
Activity와 Fragment 비교
Activity는 시스템의 액티비티 매니저에서 인텐드를 해석해 액티비티간 데이터를 전달
Fragment는 액티비티의 프래그먼트 매니저에서 메소드로 프래그먼트간 데이터를 전달
Activity로 화면을 계속 넘기는 것보다는 Fragment로 일부만 바꾸는 것이 자원 이용량이 적어 속도가 빠르다.
프래그먼트 생명주기
자체적인 생명주기lifecycle를 가지며 액티비티의 생명주기와 밀접
생명주기에 맞춰 적절한 작업을 수행해야 메모리 누수를 방지하고 애플리케이션의 성능을 최적화할 수 있다.
onAttach()
프래그먼트가 액티비티에 연결될 때 호출
이 시점에서 프래그먼트는 액티비티와 아직 완전히 연결되지는 않았다.
onCreate()
프래그먼트가 생성될 때 호출
초기화 작업, 리소스 바인딩 등을 수행.
onCreateView()
프래그먼트의 레이아웃을 인플레이트하는 곳
뷰를 생성하고, 레이아웃을 설정
onActivityCreated()
액티비티의 onCreate() 메서드가 완료된 후 호출됩
액티비티와 프래그먼트의 뷰가 모두 생성된 상태. 뷰와 관련된 초기화를 수행
onStart()
프래그먼트가 사용자에게 보여질 준비가 되었을 때 호출
필요한 리소스 할당, 애니메이션 시작
onResume()
프래그먼트가 사용자와 상호작용할 수 있는 상태가 되었을 때 호출
프래그먼트가 포그라운드에 있을 때 실행되는 작업을 여기서 처리
onPause()
프래그먼트가 일시정지될 때 호출
상태 저장, 스레드 중지 등의 작업을 수행
onStop()
프래그먼트가 더 이상 사용자에게 보이지 않을 때 호출
리소스 해제, 스레드 정지 등을 수행
onDestroyView()
프래그먼트의 뷰와 관련된 리소스를 정리할 때 호출
onDestroy()
프래그먼트가 파괴될 때 호출
프래그먼트의 상태를 정리하고, 모든 리소스를 해제
onDetach()
프래그먼트가 액티비티로부터 분리될 때 호출
프래그먼트가 액티비티와의 모든 연결을 해제
다이얼로그 Dialog
사용자에게 결정을 요구하거나 추가 정보를 입력받거나 알림을 제공하는 등의 메시지를 표시하는 작은 창
사용자가 다음으로 계속 진행하기 전에 조치를 취해야 하는 모달 이벤트에 사용
AlertDialog 클래스를 사용하면 여러 가지 대화 상자 디자인을 빌드할 수 있다.
다이얼로그 구조
제목
선택 사항이며 콘텐츠 영역에 상세한 메시지,목록 또는 맞춤 레이아웃이 채워져 있는 경우에만 사용
단순한 메시지 또는 질문을 나타내야 하는 경우 없어도 됨
콘텐츠 영역
메시지,목록 또는 다른 맞춤 레이아웃을 표시
작업 버튼
대화 상자 하나에 작업 버튼이 세 개까지만 가능
DialogFragment
안드로이드에서 대화상자 형태의 UI를 구현할 때 사용하는 클래스
Fragment 클래스를 상속받아 모든 기능을 제공하면서 대화상자를 관리하는 기능
대화상자의 생명주기를 더욱 세밀하게 관리할 수 있으며 화면 회전 같은 구성 변경 시에도 대화상자의 상태를 유지
전통적인 대화상자, 부모 액티비티의 컨텍스트 내에서 실행되는 내장된 프래그먼트, 대화상자와 유사한 UI를 가진 전체 화면 프래그먼트에서 사용
알림 Notification
앱의 UI와 별도로 사용자에게 앱과 관련한 정보를 보여주는 기능
Android 7.0부터 바로 간단한 작업(예 : 문자 답하기)가능
단말기 상단 부분에 표시되고, Android 8.0부터 앱 아이콘의 배지로도 표시
Android 8.0이상의 경우는 알림을 만들기 전에 알림 채널을 먼저 만들어야함
private val myNotificationID = 1
private val channelID = "default"
private fun createNotificationChannel() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { // Android 8.0
val channel = NotificationChannel(channelID, "default channel",
NotificationManager.IMPORTANCE_DEFAULT)
channel.description = "description text of this channel."
val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
notificationManager.createNotificationChannel(channel)
}
}
-
알림 생성방법
1. NotificationCompat.Builder 객체에서 알림에 대한 UI정보와 작업을 지정
setSmallIcon() : 작은 아이콘
setContentTitle() : 제목
setContentText() : 세부텍스트
2. NotificationCompat.Builder.build()호출
3. NotificationManagerCompat.notify()를 호출해서 시스템에 Notification객체를 전달
알림 중요도
알림 확장뷰로 긴텍스트, 이미지, 버튼, 프로그래스바 등을 추가할 수 있다.
안드로이드 12(API 레벨 33)부터는 사용자의 프라이버시를 강화하고, 앱이 사용자의 동의 없이 알림을 보내는 것을 방지하기 위해 POST_NOTIFICATIONS 권한을 앱의 매니페스트 파일에 명시적으로 추가해야 한다.
알림 권한 요청은 사용자 경험을 고려하여 적절한 시점에 수행해야 하며 사용자가 알림의 가치를 이해할 수 있도록 설득력 있는 메시지를 제공해야 한다.
<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>
'안드로이드와 앱 > 안드로이드' 카테고리의 다른 글
알림 Notification (0) | 2024.07.29 |
---|---|
프래그먼트 Fragment (0) | 2024.07.29 |
안드로이드 앱개발 4주차 강의 [액티비티] (0) | 2024.06.19 |
안드로이드 앱개발 3주차 강의 [UI] (0) | 2024.06.19 |
안드로이드 앱개발 강의 부록 (3) | 2024.06.19 |