나의 첫 포스팅에 앞서 평소 안드로이드 개발 시 사용하는 언어는 Java로, Kotlin을 사용하여 개발 할 기회가 거의 없었다. 코틀린 공부도, 블로그 시작도 생각보다 많이 늦어졌지만 이제부터라도 시작해 보려고 한다. 앞으로 공부하고 배워가는 것들을 차근 차근 적어가
📍 TextWatcher 란? EditText의 값이 변경될 때마다 입력 된 값을 실시간으로 관찰하면서 특정 작업을 처리 해주기 위한 인터페이스이다. TextWatcher에는 3가지 메서드가 있으며, 인터페이스를 구현할 때 TextWatcher가 가지고 있는 메서
화면 슬라이드는 하나의 전체 화면에서 다른 전체 화면으로 전환하는 것이다. ViewPager2 객체는 화면 슬라이드에 자동으로 애니메이션을 적용할 수 있으며, Fragment 간 슬라이드를 가능하게 한다. 💡 이미 ViewPager를 사용하고 있다면 향상된 ViewP
💡 BottomNavigation을 구현하기 전에 ViewPager와 Fragment를 구현 해주자 (아래 링크 참고) ViewPager2 구현BottomNavigation에서 사용할 아이템 메뉴를 추가한다.res 아래에 menu directory를 생성한 후 men
ListView는 사용자가 정의한 데이터 목록을 세로 방향으로 나열하여 화면에 표시하는 뷰 그룹의 한 종류이며 Adapter로부터 생성 된 뷰를 받아 리스트뷰의 항목으로 배치한다. 💡 ListView는 리스트 항목이 갱신될 때마다 아이템 뷰를 새로 구성해야 하는 단점
RecyclerView는 데이터 집합들을 각각의 개별 아이템 단위로 구성하여 화면에 출력해주는 뷰 그룹이다. 항목이 스크롤 되어 화면에서 벗어나더라도 뷰를 제거하지 않으며 화면에서 스크롤된 새 항목의 뷰를 재사용 한다. 앞서 포스팅 한 ListView의 단점을 보완하기
안드로이드에서는 RecyclerView와 함께 사용 가능한 3가지 라이브러리의 LayoutManager를 제공한다. Recycler의 아이템의 배치와 재사용에 대한 정책을 결정하면 LayoutManager의 종류에 따라 아이템의 배치가 변경되며 LayoutManager
Firebase Console 화면에서 좌측의 Realtime Database를 클릭한다.데이터베이스 만들기 버튼을 클릭하면 설정 팝업이 뜬다. 첫 번째로 실시간 데이터베이스 위치를 설정 해준다.두 번째로는 보안 규칙을 설정해주는데 잠금 모드일 경우 데이터는 기본적으로
Android에서는 일관된 모양인 카드에 정보를 표시하는 쉬운 방법으로 CardView를 제공한다. CardView를 사용하면 간편하게 컨테이너의 스타일을 일관되게 유지하면서 뷰 그룹을 포함할 수 있다.CardView 위젯을 사용하려면 앱 모듈의 build.gradle
원형 이미지 뷰를 클릭하면 앨범을 호출한다. 선택 된 이미지의 uri를 전달 받아 ImageView에 표시한다.등록하기 버튼을 클릭하면 Storage에 파일을 업로드한다.Storage 파일 업로드가 성공일 경우 Toast 메시지를 띄워준다.Firebase Console
본 포스팅은 Firebase Storage를 사용하여 다중 이미지를 업로드 하는 예제를 구현하고자 한다. Storage 사용이 처음이거나 단일 이미지 업로드를 먼저 구현하고 싶을 경우 단일 이미지 업로드 이전 포스팅을 먼저 확인해보자화면 좌측의 카메라 아이콘의 이미지뷰
지난 포스팅에서는 Firebase Storage를 사용하여 이미지를 다중 업로드 하는 예제를 만들어 봤는데, 업로드에 이어 아이템의 버튼을 클릭했을 때 아이템이 삭제 되는 기능을 추가했다. 본 포스팅에서는 추가 된 부분의 코드만 작성하려고 하니 자세한 내용은 다중 이
본 포스팅에서는 Swiperefreshlayout를 사용하여 아래로 당겼을 때 화면이 새로고침 되는 예제를 만들어 보려고 한다. RecyclerView와 CardView를 사용하여 아이템 리스트 목록을 보여주고 화면이 새로고침 될 때마다 리스트의 요소들을 랜덤하게 재배
네이버 클라우드 플랫폼에 접속한 후 콘솔에 들어간다.콘솔 메뉴에서 AI·NAVER API > AI·NAVER API > Application 메뉴를 선택한 다음, 약관 동의 후 Application 등록을 진행한다.약관동의 후 나타나는 화면에서 Application 이
이전 포스팅에서는 네이버 지도 API를 사용하여 화면에 지도를 표시하고 현재 위치를 표시하는 예제를 만들었다. 이어서 네이버 지도를 클릭했을 때 마커가 표시되는 것과 동시에 해당 주소를 Toast 메시지로 나타내고자 한다. 네이버 지도의 OnMapClick() 이벤트를
모듈 수준 build.gradle 파일에 다음 종속 항목이 포함되어 있는지 확인해야 한다.💡 Android 13(API 수준 33)에서는 앱에서 예외 없는 알림을 보내기 위한 새로운 런타임 권한 POST_NOTIFICATIONS를 도입했다.AndroidManifest
📍 Firebase Console을 사용하여 Firebase 추가 > Firebase 프로젝트 만들기 및 Firebase에 앱 등록 하는 부분은 참고할 수 있는 예제가 많기에 본 포스팅에서는 생략하려고 한다. Firebase 문서의 'Firebase 프로젝트에 Fir
이전 FCM - PUSH 알림 받기 포스팅에서는 FCM을 사용하여 Firebase Console에서 메시지를 전송하고 PUSH 알림을 받는 예제를 만들었다. 본 포스팅에서는 안드로이드 앱에서 FCM을 사용하여 다른 사용자에게 메시지를 전송하는 예제를 만들어 보려고 한다
레이아웃을 구성할 때 LinearLayout 또는 ConstraintLayout을 주로 사용했는데 RelativeLayout을 사용해보려 해도 속성들이 비슷하고 많다보니..😵💫 헷갈리는 부분이 많아 거의 사용하지 않았다. RelativeLayout은 나에게 어려운
앱이 최초로 실행 되어 MainActivity 화면이 나타날 경우의 생명주기 > MainActivity_LifeCycle D onStart() MainActivity_LifeCycle D onResume() MainActivity에서 SubActivity로 이
Fragment란? > Fragment는 FragmentActivity 내의 어떤 동작 또는 사용자 인터페이스의 일부를 나타낸다. 여러 개의 프래그먼트를 하나의 액티비티에 결합하여 창이 여러 개인 UI를 빌드할 수 있으며, 하나의 프래그먼트를 여러 액티비티에서 재사용
과제의 목표공통EditText를 실시간으로 입력 받아 유효성을 체크한다.EditText Focus out 할 때 입력하지 않았을 경우 에러 텍스트를 노출한다.이메일EditText Focus 할 때 이메일을 입력하지 않았을 경우 에러 텍스트를 노출한다.서비스 제공사를 S
ViewModel이란 Android Jepack의 구성 요소 중 하나로, 본래 ViewModel이란 이름은 소프트웨어 디자인 패턴 중 하나인 MVVM(Model - View - ViewModel) 디자인 패턴으로부터 파생되었다. MVVM의 관점에서 봤을 때 ViewMo
Observer Pattern(옵저버 패턴)이란 서브젝트의 상태 변호를 관찰하는 옵저버들을 객체와 연결하고 서브젝트의 상태 변화를 초래하는 이벤트가 발생하면 객체가 그 이벤트를 직접 옵저버에게 통제하는 구조로 디자인 패턴의 한 종류이다. 옵저버에 의해 값의 변경을 감시
오늘부터 본격적으로 앱개발 기초 팀프로젝트가 시작 됐다. 주제는 SNS 앱 만들기로 예시로 인스타그램이 주어졌지만 팀원들과 여러 SNS를 얘기하며 결정한 주제는 게임 커뮤니티 앱이다. 구현 하고 싶은 기능은 많지만 비교적 짧은 기간으로 인해 최소한의 기능으로 디테일을
어제(SNS 앱 팀 프로젝트 (1))에 이어 오늘도 메인 화면을 구현했다. 메인 화면에서 캐릭터를 클릭하여 디테일 화면으로 이동할 시 animation을 적용하는 부분을 추가했다. kotlin animation을 검색하면 가장 많이 나오는 함수는 overridePend
overridePendingTransition을 사용하여 Activity의 화면 전환 시 애니메이션을 적용하려고 했으나 Deprecated 되었다고 하여 해결할 방법을 찾아보았다. API 버전이 34 이상일 경우에는 overrideActivityTransition을 사
어댑터 뷰(AdapterView)는 여러 개의 항목을 다양한 형식으로 나열하고 선택 할 수 있는 기능을 제공하는 뷰리스트 뷰(ListView) : 항목을 수직을 나열시키는 방식그리드 뷰(GridView) : 항목을 격자 형태로 나열시키는 방식어댑터 뷰는 표시 할 항목
뷰 바인딩(View Binding) 기능을 사용하면 뷰와 상호 작용 하는 코드를 쉽게 작성할 수 있다.모듈에서 사용 설정 된 뷰 바인딩은 모듈에 있는 각 XML 레이아웃 파일의 결합 클래스를 생성한다.바인딩 클래스의 인스턴스에는 상응하는 레이아웃에 ID가 있는 모든 뷰
프래그먼트(Fragment)는 액티비티 위에서 동작하는 모듈화된 사용자 인터페이스액티비티와 분리되어 독립적으로 동작할 수 없다.여러 개의 프래그먼트를 하나의 액티비티에 조합하여 창이 여러개인 UI를 구축할 수 있으며, 하나의 프래그먼트를 여러 액티비티에서 재 사용 할
과제 목표 (메인 페이지) v 디자인 및 화면 구성을 최대한 동일하게 해주세요. (사이즈 및 여백도 최대한 맞춰주세요.) ✨ v 상품 데이터는 아래 dummy data 를 사용합니다. (더미 데이터는 자유롭게 추가 및 수정 가능) v 데미데이터 : 이미지 링
오늘은 메인 액티비티에서 서브 액티비티로 data class 객체를 Intent의 데이터로 전달 하기 위해 Parcelize를 사용하였는데 이 내용을 정리해보려 한다. app 수준의 build.gradle 파일의 plugins에 id("kotlin-parcelize")
Apple Market (1) 에 이어서 메인 페이지의 나머지 기능과 상세 페이지를 구현 하였다.과제 목표 (메인 페이지)v상품 선택시 아래 상품 상세 페이지로 이동합니다.v 상품 상세페이지 이동시 intent로 객체를 전달합니다. (Parcelize 사용)(상세 페이
View를 사용하여 width, height의 크기를 정하고 background로 선의 색상을 지정하면 수직, 수평선이 만들어진다.
RecyclerView의 아이템이 변경되거나 추가, 삭제 등이 되었을 경우 RecyclerView에 반영하는 방법에 대해 정리해보려 한다. RecyclerView를 업데이트 하기 위해서는 내용 변경 후 Adapter에 알려주면 된다. 기본적으로 변경 사항에 대한 내용을
과제 목표 스크롤 상단 이동 [v] 스크롤을 최상단으로 이동시키는 플로팅 버튼 기능 추가 [v] 플로팅 버튼은 스크롤을 아래로 내릴 때 나타나며, 스크롤이 최상단일때 사라집니다. [v] 플로팅 버튼을 누르면 스크롤을 최상단으로 이동시킵니다. [v] 플로팅 버튼은
과제 목표좋아요 처리v 상품 상세 화면에서 좋아요 선택시 아이콘 변경 및 Snackbar 메세지 표시v 메인 화면으로 돌아오면 해당 상품에 좋아요 표시 및 좋아요 카운트 +1v 상세 화면에서 좋아요 해제시 이전 상태로 되돌림// Snackbar 생성
오늘 팀 회고를 진행하며 this와 this@MainActivity의 차이점이 뭔지에 대한 얘기가 나왔다. 생각해보니 개발을 하며 Context를 인자로 줘야 할 때 this, applicationContext() 등 작동이 되는 것으로 넣어서 구현한 적이 많았던 것
리사이클러뷰가 멀티뷰 타입을 지원한다는 것을 알게 되어 간단한 샘플을 만들어 내용을 이해해 보려 한다. 멀티뷰 타입을 적용하면 한 개의 리스트에서 여러 유형의 아이템을 보여줄 수 있으므로 여러 개의 리스트를 만들지 않아도 돼서 많이 유용할 것 같다 ! 🤗
UI 상태를 유지하기 위한 옵션 저장된 인스턴스 상태는 ViewModel의 일부로 onSaveInstanceState() 및 rememberSaveable API와 SavedStateHandle을 포함한다. 저장된 인스턴스를 어떠한 API로 사용할지는 상태가 유지된 위
사용자가 페이지를 아래로 스크롤 할 때 화면 상단에 고정 된 뷰를 말한다. ItemDecoration을 사용하여 상단의 Top Holder를 RecyclerView 위에 그려 고정 된 것처럼 보이게 하는 코드를 정리해보겠다. 참조\[Android] Sticky Hea
새로운 팀 프로젝트 주제로 주소록이 주어졌다. 과제의 필수 기능 중 하나인 ViewPager2와 TabLayout을 사용하여 화면을 슬라이드 하고 선택한 탭에 해당하는 화면으로 전환하는 기능을 구현하였다. ViewPager2를 사용하기 위해 build.gradle(앱
iconifiedByDefault 속성을 사용해 밑줄쳐진 검색필드를 검색할 때만 활성화 시킬 수 있다. 기본값은 true이며, SeachView를 아이콘화 시키고 싶다면 해당 속성을 따로 입력하지 않아도 된다.OnQueryTextListener는 SearchView에
주소록 팀과제를 시작할 때 우리만의 주소록 앱을 만들기 위해서는 어떠한 새로운 기능이 필요할까? 에 대해 얘기를 나눴었다. 처음에는 색깔 태그로 그룹을 관리하자는 얘기가 나왔다가 더 업그레이드 하여 사용자가 등록하는 이미지로 그룹을 관리해보기로 하였다. 그러기 위해 사
TatgetSdk = 34 인 상태에서 갤러리에서 가져온 이미지를 이미지뷰에 세팅 하려고 하니 이미지가 안 보이는 현상이 발생했다. 발생하던 에러를 해결했음에도 불구하고 여전히 이미지가 표시가 안되어서 찾아보니 Sdk 버전에 따른 권한 문제였다 ! 이번 팀과제는 유독
프로그램의 설정 정보 (사용자의 옵션 선택 사항이나 프로그램의 구성 정보)를 영구적으로 저장하는 용도로 사용XML 포맷의 텍스트 파일에 키-값 세트로 정보를 저장SharedPreferences 클래스Preferences의 데이터(키-값)를 관리하는 클래스응용 프로그램
RoomSQLite를 쉽게 사용할 수 있는 데이터베이스 객체 매핑 라이브러리쉽게 Query를 사용할 수 있는 API를 제공Query를 컴파일 시간에 검증함 Query 결과를 LiveData로 하여 데이터베이스가 변경될 때마다 쉽게 UI를 변경할 수 있음SQLite 보다
Room Database를 사용한 예제 코드
사용자의 위치를 추적하기 위한 3가지 권한android.permission.ACCESS_COARSE_LOCATION : 와이파이나 모바일 데이터(또는 둘 다 사용)를 사용해 기기의 위치에 접근하는 권한으로 도시에서 1 블록 정도의 오차 수준이다.android.permi
Google Cloud에 접속하여 프로젝트 만들기를 클릭한다. 새 프로젝트 창에서 프로젝트 이름을 입력하고 만들기를 클릭한다. 프로젝트를 생성하고 API 및 서비스 ➡️ 라이브러리 로 이동한다. Maps SDK for Android 를 클릭한다. Maps SDK for
RecyclerView.Adapter를 사용하면 데이터가 추가, 삭제, 변경이 되었을 때 notifyDataSetChanged()를 통해 리스트 전체를 업데이트 한다. notifyDataSetChanged()를 사용할 경우 데이터셋의 변경을 감지하면 리스트 전체를 변경
RecyclerView를 구현할 때 아이템 클릭 이벤트를 사용하기 위해 Adapter 안에 인터페이스를 선언하고 인터페이스를 상속 받아 함수를 구현하여 사용했었다. 매번 이런식으로 인터페이스를 구현하여 사용하다보니 번거롭기도 하고 코드가 지저분해지는 것 같은 느낌이 들
스크롤 끝 감지 최상단으로 이동
Retrofit으로 이미지 검색 API를 이용하기 위해 앱에 인터넷 접근 권한을 준다.이미지 검색 API의 Json 응답에 대응하는 DTO를 작성한다. Json은 객체를 중괄호로 감싸서 표시하는데, 이걸 DTO로 변환할 때는 객체 하나를 데이터 클래스 하나로 대응시킨다
지난 포스팅에는 Retrofit을 사용하여 Kakao API 검색 결과를 불러오는 화면에 대해 정리했었다. 이어서 이미지 리스트에서 이미지를 클릭하면 내 보관함에 저장되고, 보관함에서 이미지를 삭제하면 검색 화면에도 반영되는 부분에 대해 정리해보겠다 ! 🤓검색화면(S
이번에는 Kakao Api를 사용하여 이미지와 동영상 검색을 동시에 이루어지도록 했다. 사용자가 검색 화면에서 검색어를 입력한 후 버튼을 클릭하면 한 개의 검색 키워드로 이미지, 동영상 검색이 가능하다. 이번 포스팅에는 Kakao Api 이미지 검색 과 달라진 부분만
기존에는 Fragment를 전환하려면 supportFragmentManager로 FragmentManager 인스턴스를 반환 받고 add나 replace 를 통해 Fragment를 교체하고 commit으로 직접 transaction을 실행했어야 했다. 그런데, Jetp
Youtube Data Api를 사용하여 미디어 앱을 만드는 중 Api를 호출하고 데이터를 수신 하여 RecyclerView에 보여주기까지 몇 초의 시간이 걸렸다. 사용자의 입장에서 생각했을 때 아무런 반응이 없고 빈 화면만 보인다면 앱이 무슨 상태인지 알 수 없을거라
이번 팀과제인 MomenTravel은 Youtube Api를 사용하여 여행지와 관심사를 선택하면 해당 키워드로 필터링 된 동영상을 보여주는 앱이다. 키워드로 api를 호출하고 결과 리스트를 보여주는 과정에 로딩 화면이 있으면 좋겠다고 생각하여 세 개의 점이 번갈아가며
xml의 Design Editor에서 ConstraintLayout > Convert to MotionLayout > CONVERT를 하면 res/xml/ 위치에 activity_splash_scene 파일이 생성된다.
비동기적으로 작업을 처리하는 코루틴에서 suspend 함수를 사용하면 작업이 모두 완료 된 후에 단일값만을 반환 받을 수 있다. 하지만, 중간 중간 진행 되는 코루틴 작업 중에 갱신 되는 값까지 반환받을 수 있다면 로직 업데이트를 더 촘촘히 수행할 수 있을 것이다. F
Room의 LiveData 응답을 Flow로 변경하는 과정을 정리해보고자 한다. 코드를 리팩토링하며 어느정도 감은 잡히는 것 같은데... Flow의 개념에 대해 다시 공부하는 시간을 가져야 할 것 같다 😵💫 Room의 Query 응답을 LiveData에서 Flo
Paging : 하나의 문서를 분리 된 페이지로 나누는 것 RepositoryPagingSource : 데이터 소스와 그 소스에서 데이터를 검색하는 방법을 정의RemoteMediator : 로컬 데이터베이스에 네트워크 데이터를 캐시하는 동작을 관리ViewModelPag
dependency > project 레벨의 build.gradle에 dependency를 추가한다. > app 레벨의 build.gradle에 dependency를 추가한다. Application Class > Hilt Component의 가장 상위 스코프가 되는
앱 모듈의 의존성을 ImageSearchRepository에 주입하고 ImageSearchRepository 인스턴스는 ViewModel에 주입한다. 그리고, 각 Fragment에 ViewModel 인스턴스를 주입하면 된다.
다음주부터 본격적으로 최종 프로젝트 개발에 들어간다. 이번 프로젝트에는 Firebase의 realtime database를 사용하는데, Firebase를 오랜만에 사용하려다 보니 헷갈리는 부분이 있어서 샘플 코드를 정리하며 복습해보려고 한다. 🤓
ViewModel이 매개변수를 필요할 때 ViewModelFactory를 사용한다 정도로만 이해하고 ViewModel을 사용했었다. 오늘 나희님이랑 얘기를 하다 ViewModelFactory를 사용하는 이유가 뭘까?Factory를 사용하지 않으면 어떻게 될까? 직접 매
✨ 구현 내용 요약 Horizontal 타입의 RecyclerView를 사용하여 각 월을 표시하며 해당 월 안에서 일수를 나타내기 위한 Grid 타입의 RecyclerView를 사용하여 달력을 표시한다. PagerSnapHelper()를 사용하여 RecyclerVie
smoothScrollBy는 스크롤을 부드럽게 이동시키는 데 사용된다. smoothScrollBy 메서드는 일정한 속도와 시간 간격으로 스크롤을 이동시켜 부드러운 스크롤 경험을 제공한다. smoothScrollBy의 매개변수dx : 가로 방향으로 스크롤 할 픽셀 수로
프로그래머스 문제를 풀며 DFS나 BFS를 요구하는 문제들이 있어 개념을 한 번 정확하게 짚고 넘어가야겠다 싶어 오늘은 DFS와 BFS에 대해 정리해보려고 한다. 깊이 우선 탐색은 그래프의 한 경로를 끝까지 탐색 후 다음 경로를 탐색하는 방식의 알고리즘이다. 깊이에 중
캘린더를 직접 만들어서 사용하려 했지만 캘린더가 스크롤 되어 보여지는 월이 달라질 때, 현재의 월이 아닌 날짜를 클릭 했을 때 등 원하는 동작을 구현하는 데 시간이 많이 소요될 것 같아 라이브러리를 찾아보게 되었다. 캘린더 커스텀이나 해당 날짜에 등록 된 일정이 있을
- 모듈은 앱을 구성하는 요소로, 관련된 소스 코드나 리소스 등을 하나로 묶는 단위이다. 프로젝트에는 여러 모듈을 포함할 수 있으며, 각 모듈은 다른 모듈을 종속성으로 사용할 수 있다. 각 모듈은 독립적으로 빌드, 테스트, 디버그가 가능하다. 안드로이드 스튜디오에서 새
Ktor > Ktor는 Kotlin을 위한 비동기 웹 프레임워크이다. 주로 HTTP 클라이언트와 서버를 구축하는 데 사용되며, Ktor를 사용하면 RESTful API를 호출하거나 서버 사이드 애플리케이션을 쉽게 만들 수 있다. Ktor 특징 비동기 I/O 지원: