한개의 리사이클러뷰에 여러개의 어댑터를 달아야 하는 상황이 있다.
동기와 비동기는 요청을 보낸 후 어떻게 다음 방식을 동작시키는지에 대한 이야기이다. 왼쪽은 동기 /// 오른쪽은 비동기식 방식이다. 동기방식 (Synchronous) 요청을 보낸 후 응답(=결과)를 받아야지만 다음 동작이 이루어지는 방식이다. 어떠한 일을 처리할 동안 다른 프로그램은 정지한다. 여러개의 일을 진행해야 할경우 ( A, B, C, D, ...
Rx의 역사 Rx는 MS에서 먼저 나왔고, 넷플릭스에서 이를 Java로 컨버팅 하였다. 지금은 여러 언어에서 사용이 가능하다. 비동기 데이터 스트림을 처리하는 API를 제공하는 라이브러리다. 쉽게 말해 비동기 행위를 간단하게 처리하기 위해 만들어진 라이브러리 인 것이다. [https://huns.me/development/2051?utmcontent=b...
늦은 초기화 lateinit 프로퍼티를 선언하지 않고 초기화를 미루는 방법이다. 전역 변수로 선언 후 null값을 지정하지 않고 초기화 할 수 있다. var를 이용한 경우에만 사용이 가능하다. User1의 lateData를 선언할때 초기값을 설정하지 않았다. 이것을 후에 user.lateData = "Hello" 를 통해서 사용한다. 이런것이 늦은 ...
안드로이드 Jetpack이란 개발자가 고품질 앱을 손쉽게 개발할 수 있는 라이브러리,도구,가이드 모음을 의미한다. Jetpack은 플랫폼 API와는 별도로 제공되는 androidx 패키지 라이브러리로 구성된다. buildgradle 혹은 import할때 위에 and
Kotlin에는 여러가지 편리한 기능을 위한 함수들이 있다. 그중에서 대표적인 것은 범위 지정 함수이다. 이를 사용하면 코드를 좀 더 깔금하고 간결하게 사용할 수 있다. 범위 지정 함수란? 확장 함수는 람다를 인자로 받아 동작하며, 확장함수를 실행하는 주체를 수신자 혹은 수신자 객체라고 부른다. 범위 지정 함수는 람다식이 제공된 객체에서 호출하면 임시...
Fragment는 화면이 커지는 Tablet이 생겨나면서 한 화면에 다양한 레이아웃과 Widget등을 표현하기 위해서 생겨났다. Fragment는 여러 화면에서 재사용이 가능하다. 자체 생명 주기를 가지고 있다. 동적으로 추가,삭제,교체(FragmentTransaction)가 용이하다. 자체 입력 이벤트를 받는다. 액티비티 실행 중에 추가 및 제...
dp와 sp의 차이 DP(Density-Independent Pixels) dp : 고정된 값 UI레이아웃의 위치나 크기를 지정할때 사용하는 단위이다. 화면의 크기가 달라도 안드로이드의 비율에 따라서 보여줄수 있다. SP(Scale-Independent Pixels) sp : 사용자의 설정에 따라서 사이즈가 변할 수 있는 값. 주로 텍스트의 크기를 ...
set을 사용하는 이유 일관성을 가진 텍스트뷰들을 단체로 관리 리사이클러뷰나 어떤 연관된 값들을 보여줄때 자주 사용된다. > forEach와 forEachIndexed forEach 특정 리스트가 주어졌을때 그 리스트의 사이즈 만큼 for문을 돌리고 싶을때 주로 사용한다. 해당 element들에 대하여는 it으로 받을 수 있다. 만약 특정경우에 fo...
Handler 사용하기 안드로이드는 기본적으로 싱글 스레드를 갖는다. 그리고 별도의 설정을 하지 않는다면 동일 프로세스의 동일 스레드에서 실행된다. 어플을 실행하면 안드로이드 시스템이 어플에 대한 쓰레드를 생성하는데 이를 메인쓰레드라고 한다. 메인 쓰레드는 안드로이드 UI와 어플리케이션이 상호작용하는 쓰레드라서 MainThread = UI Threa...
build에 추가해주기. 로티에서 원하는 애니메이션을 찾은 후 json파일로 다운 받기. https://lottiefiles.com/featured 다운로드 - json. 파일 이름은 원하는걸로 바꿔도된다. res에서 raw를 만들어서 넣는다. 혹은 app 에서 New - Folder - Asset 을 만들고 이 안에 넣어도 된다. ![](h...
개발자들은 개발을 시작 할 때 여러 모습을 보여준다. 혼자서 개발을 하면 다른 사람과 공유 할 필요가 없지만 프로젝트 단위로 움직이게 된다면 내가 무엇을 하는지 어떻게 코드를 작성해야하는지 문서화로 정확하게 명시할 필요가 있다. 대부분의 개발자들은 코드로 소통을 하기
안드로이드 제트팩에는 네비게이션이라는 것이 있다. UI전환을 시각적으로 보여주어서 좀 더 편하게 도와주는 라이브러리 입니다. 먼저 App단위의 gradle에서 dependency를 추가해야 한다. 그리고 3개의 fragment를 만들어 준다. Navigation Host Navigation을 구현 할 때에는 Host를 정의해야 합니다. Host는 화...
왜 사용해? 복잡한 형태의 Recyclerview를 좀 더 쉽게 구현하기 위해 만들어진 라이브러리입니다. Airbnb에서 만들어진 오픈소스 라이브러리입니다. 여러 뷰 타입을 갖는 Multi type Recyclerview에서 효율적으로 사용 가능합니다.
안드로이드 작업을 하다 보면 바텀시트를 자주 사용하게 된다.이번엔 그중 바텀시트가 상단부에 일부분이 미리 보여지고 클릭시 지정한 만큼 확장되는 경우가 있다.이러한 부분을 컨트롤 하기 위해서 BottomSheetBehavior에 대해 알아보도록 하자.BottomSheet
머릿속으로만 알고있는 개념들을 정리하기 위해서 정리를 해보려고 합니다.클린아키텍처의 공통적인 목표는 관심사의 분리입니다.이를 동작하기 위해서는 의존성 규칙을 지켜야 합니다.의존성 규칙은 무엇일까요?의존성 규칙이란 모든 소스코드 의존성은 반드시 외부에서 내부로, 고수준
소프트웨어 패턴중 하나입니다.최근 MVVM으로 구성되지 않은 앱을 찾기 어려울정도로 대중화가 되어있기 때문에 MVVM으로 가는발판으로 생각하고 포스팅을 시작합니다.먼저 명명부터 알아봅시다.Model - View - Presenter로 구성되어 있습니다.Model 앱에
MVVM을 공부하던 도중 따로 정리해야겠다라는 생각이 들어서 작성하게 되었습니다.어떤 이벤트가 발생하는 것을 감시하는 패턴입니다.예를들어 어떤 유튜버를 구독한다고 생각합시다.A,B,C는 해당 유튜버를 구독하고 있고 D,E는 구독하지 않았습니다.유튜버가 업로드를 하는순간
또 다른 버거를 추가하고싶어요!생성하고 싶은 Burger가 한개 더 생겼습니다!모듈에 무엇을 넣는지 알려주어야 겠습니다.하지만 이렇게 되면 맨 마지막 provideBurger부분에서 어떤 버거인지 알 수 없습니다. 두개의선택지가 있기 때문이죠.이걸 위해서 사용하는 것이
흔하게 사용하는 ImageView에서 lint error가 발생하기 시작했다.이유는 conteentDescription때문이였다.그래서 contentDescription에 대해서 알아보았다.이녀석은 콘텐츠 라벨이라는 요소에 속해있다.콘텐츠 라벨은 android:cont
HTTP 통신 시 서버에서 보내주는 응답코드들은 다양한 종류가 있습니다.이것들은 규격화 되어있으며 응답 코드를 보고 무슨 문제인지 파악할 수 있습니다.자주 찾기 때문에 한번 정리가 필요하다고 생각이들어 정리를 시작합니다.클라이언트에서 서버에 어떤 요청을 하면 서버는 응
그 유명한 네아로를 구현해보자.사족떼고 구현하는 방법만 딱 적어본다.https://developers.naver.com/docs/login/android/android.md사전 준비 ( 앱등록, 클라이언트id , secret) 을 받아온다.buildgradle
코린이가 보는 힐트이다.계속해서 수정을 해 나아가야하는 게시글, 그리고 꼭 익혀야하는 글이다.잊지 말아야 할 기본 동작 순서1번 : 재료를 불러올 인터페이스 +2번 : 각 재료들을 생성자로 Inject받아서 무엇을 할지 구체화 할 클래스(있어도되고 없어도되고) → 3번
API를 이용하다보면 에러시 응답코드와 설명을 주는 경우가 있다. API를 만들때 모든 백엔드가 고려하는 상황이며 API를 사용하는 사람은 어디서 어떤 이유때문에 에러가 발생했는지 알 수 있어야한다.Errorcode와 Description이 있다고 가정하고 시작하자.
오픈소스 넌 도대체 뭐냐
너무 예제가 없어서 내가 표본이 되리라 에폭시 라이브러리 사용법입니다!
Epoxy를 사용하면서 SnapHelper를 사용해보자
Room을 이용한 로컬 저장소나 API통신을 거친 네트워크의 대규모 데이터 세트를 로드하기 위해 사용한다.예를 들면 무슨 네이버에서 무슨 검색어를 입력했을때 해당되는 모든 데이터를 가져오는 것이 아니라 10페이지씩 가져오게 됩니다.페이징 된 데이터의 메모리 내 캐싱.
소프트키를 무찔러봅시다.
웹뷰란? 먼저 앱은 두가지로 크게 나뉩니다. 네이티브앱, 하이브리드앱 보통의 모바일에서 사용하는 앱은 OS혹은 플랫폼에서 제공하는 SDK(Software Deevelopment Kit)를 기반으로 개발된 앱이며 이를 일반적으로 네이티브 앱이라고 지칭합니다. 앱의
앱 배포를 위해 apk 파일을 만들던 중 apk파일의 크기를 줄이고 난독화가 필요하게 되어서 작성합니다!내 첫 배포 ㅜㅜ 제발 조금만 문제가 일어났으면.
디자인 요구에 따라 뷰페이저에 무한스크롤과 자동스크롤을 구현해야했다.디테일한 요구사항은 좋아요가 있으면 좋아요 한 이미지가 나오고 없으면 3개의 뷰페이저가 좌우로 흘러가는데 그것들이 다른 방향으로 무한슼크롤 + 자동스크롤이 되어야했다.처음에 요구사항을 듣고 좌우로 흘러
액티비티 위에 프래그먼트가 띄워져있는 상황에서 뷰모델을 공유할 상황이 생긴다.기존의 viewmodel을 생성할때이렇게 생성했다. 하지만 이렇게 생성하게 되면 fragment에 종속된다.다른 fragment와 공유하고 싶다면 viewmodels()대신이렇게 설정해햐 한다
ViewModel에서 LiveData값을 변경해주는 일이 자주 발생한다. 이때 값을 변경해 줄 때 setValue()와 postValue() 두개가 있고 이것들의 차이점을 알고자 했다.기본적으로 LiveData는 AAC에서 제공하는 라이브러리중 하나로 DataBindi
jitpack.io를 통한 라이브러리를 설치시 계속해서 문제가 발생했다.allproejctssettings.gradlle나의 경우에는 1번으로 해결이 되지 않아 2번 방법을 진행했고 다행히 해결했다.
코루틴은 기본적으로 반환값으로 job을 보내는 경우가 많다.하지만 특정상황에서 코루틴 내부에서 일어난 작업의 값을 반환하고싶거나 특정 동작이 일어난 후 진행이 되게끔 동기적으로 처리하고 싶은 경우도 생길것이다.기존에는 async,await을 이용하면서 Deferred값
안드로이드에서 뒤로가는 버튼은 2가지가 존재한다.아이폰유저가 친숙한 상단의 백버튼,안드로이드 유저가 친숙한 하단의 백버튼이 있다.이에 맞춰서 jetpack - navigation 에서 뒤로가는 버튼은 두가지 종류가 존재한다.상단의 백버튼은 navigateUp, 하단의
리사이클러뷰에서 탈출하자. NotifyData는 이제 그만. DiffUtil,ListAdapter,AsyncListDiffer
앱을 만들다보면 피할수 없는 상황을 드디어 만났다.이번에 다뤄볼 내용은 아임포트를 이용한 결제 시스템 연동이다.몇년전에는 HTML에 전부 적어 웹뷰로 실행시키는 방법이 있었다고 한다.하지만 개발자분들이 열심히 노력한 결과 아임포트 SDK를 완성시켰다. 하지만 주니어인
안드로이드의 jetpack에는 navigation이라는 라이브러리가 존재합니다.기본적으로 fragment들의 이동, 스택을 관리하기 위한것이며 많은 어플에서 바텀 메뉴를 사용하고 액티비티보단 fragment로 화면을 구성하기 때문에 반드시 익혀두어야 할 라이브러리중 하
새로운 기능을 개발하다 보니 모듈들끼리 상호 참조에 걸리게 되었다.circular dependency다음과 같은 문구가 뜨면서 앱이 실행 되지 않는다.나같은 경우 Hilt를 사용하는 부분에서 발생하였고 JVM에서 data class를 호출하는 부분에서 발생하는 것으로
안드로이드에는 모든 행동들이 터치로 인해 이루어진다.그렇다보니 개발을 하다보면 ”어 버튼이 왜 안눌려지지?””왜 스크롤이 안되는거야?” 등등...이와 같은 터치에 대한 에러가 발생할 경우가 생긴다.이는 복합적인 원인이 있겠다.터치 이벤트를 적용하지 않음.터치 이벤트를
RecyclerVIew를 사용하다 보면 아이템안으로 들어가거나 다른 프래그먼트,액티비티를 띄우는 경우가 발생한다.이후 다시 되돌아오면 리사이클러뷰의 위치가 항상 처음으로 바뀌어있어서 불편함을 겪는 경우가 있다.예전에는 position을 저장하여 복구하거나 savedIn
게시판에서 글을 작성해야 하며 해당 Fragment를 재사용하여 수정하기 기능도 추가하였다.기존에 글을 작성할 때 사진 첨부가 가능하며 사진 관련 기능으로는1\. 갤러리에서 선택2\. 최대 5장까지 허용3\. 한장씩 혹은 여러개를 한번에 추가 가능4\. 리사이클러뷰에서
애자일 방법론중 XP(extreme programming)이라는 것이 있습니다.XP의 실무 관행 중 하나로 일명 짝 프로그래밍이라고도 불립니다.기본적인 원칙은 한명이 코드를 작성하고 다른 한명이 실시간으로 리뷰를 하는 방식을 의미합니다.그리고 역할은 주기적으로 교체하며
보통 스크롤 뷰 안에 스크롤 뷰를 넣을때 사용합니다.부모의 스크롤 뷰에게 이벤트를 뺏기지 않고 자식의 스크롤 뷰에서 이벤트를 소비하고 싶을때 사용하며parent.requestDisallowInterceptTouchEvent(true)로 주어 이벤트를 뺏기지 않게 막을
https://medium.com/tech-takeaways/how-to-update-paginated-data-with-the-android-paging-3-library-ef2d8581e77fPaging3는 PagingLibrary의 가장 최근 버전이다.해
이벤트버스는 과거에 이벤트 기반의 아키텍처를 구현하기 위해 사용 되었었던 방식이다.최근에 Java → Kotlin으로의 대체가 시작되면서 이 접근방식은 점점 KotlinFlow, Livedata와같은 subscribe / publish 아키텍처 구현방식으로 변화해 갔다
https://developer.android.com/courses/pathways/composeJetpack Compose Tutorial입니다.공식문서를 해석하며 Jetpack Compose를 학습합니다.@Composable 을 이용하여 앱의 구성을 정의한
Jetpack compose를 공부하던 중 선언형UI라는 단어가 나왔고 이에 대해 정리를 해보려고 한다.기존의 UI를 만드는 방식으로 기존 안드로이드는 트리형태로 뷰를 구성한다.레이아웃을 맨 아래에 깔고 그 위에 브랜치처럼 텍스트뷰, 이미지뷰를 넣고 다시 레이아웃을넣는
visibility를 이용한 true,false로 아이콘을 상황에 맞추어 보여주고 지울수 있다.하지만 갑작스럽게 사라지고 나타난다면 유저로 하여금 당황스러움을 줄 수 있다.안드로이드에서는 이에 따른 Fade In, Fade Out 애니메이션을 지원하고있고 2가지 방법이
클로저는 내부함수가 외부함수의 context에 접근 할 수 있는 것을 가리킨다.내부함수에서 외부함수의 데이터를 사용할 경우 외부함수의 코드블럭이 끝나도 내부함수에서 참조한 변수가 계속 살아있게된다. 이 뜻을 의미하려면 다음 코드예시를 보자.정답은 외부함수 x 값이 살아
PendingIntent는 Pending 이라는 단어의 뜻을 알면 된다.Intent의 의미Android에는 크게 4대 컴포넌트들이 있다.Activity,Service,Broadcast Receiver, Content Provider인텐트는 이러한 구성요소들 간의 작업을
안드로이드에서 앱을 꺼 놓은 상태에서도 어떤 이벤트에 의한 알림을 받을 수 있다.Firebase의 클라우드 메시징은 이러한 메시지를 빌드, 전송, 수신을 도와준다.FCM에서 메시지를 수신하도록 기기를 등록합니다. 클라이언트 앱의 인스턴스가 메시지를 수신하도록 등록하여
Compose는 선언적이므로 Compose를 업데이트하는 유일한 방법은 새 변수로 동일한 컴포저블을 호출하는 것입니다. 이러한 변수는 UI 상태를 표현합니다. 상태가 업데이트될 때마다 재구성됩니다. TextField와 같은 항목은 명령형 XML 기반 뷰에서처럼 자동으로
https://medium.com/proandroiddev/supporting-different-screen-sizes-on-android-with-jetpack-compose-f215c13081bd안드로이드의 레이아웃이나 UI 요소를 생성하기 위해 픽셀 대신
카카오링크는 사용자가 카톡 메시지로 친구에게 메시지에 담긴 정보를 공유하는 기능입니다. 사용자는 동적링크를 이용하여 해당 웹이나 앱으로 친구를 초대할수 있습니다.기존의 Android Intent의 Send와 비슷한 기능이지만, 카톡에서 가능하다는 점과 커스텀을 위한 메
개발을 하면서 앱이 점점 복잡해 질수록 Fragment끼리의 통신을 필요로 하게 된다.사용자의 이벤트에 따라 올바르게 반응하거나 한가지 이벤트에 대해서 서로 다른 여러개의 Fragment가 반응해야 할 경우 공통의 채널이 필요로 하게 된다.안드로이드에서는 보편적으로 두
전역 클립보드에 텍스트를 배치하고 검색하기 위한 클립보드 서비스에 대한 인터페이스이다.ClipboardManager API 자체는 매우 간단하다.현재 기본 클립보드 데이터를 가져오고 설정하는 메서드로 구성되어있다. ClipData해당 데이터는 응용 프로그램 간의 데이터
\[https://developer.android.com/jetpack/compose/navigation?hl=ko먼저 NavHost를 NavController를 단일 NavHost 컴포저블과 연결해야 합니다. NavHost는 구성 가능한 대상을 지정하는 탐
공식문서https://developers.facebook.com/docs/sharing/android안드로이드 공유앱 내의 컨텐츠를 페이스북으로 공유할 때 사용합니다.기본적으로 Android의 ActionSend를 이용하여 공유가 가능하지만 facebook s
파이어베이스 Dynamic Link사용기 링크 클릭으로 외부 사용자를 끌어들이자 !
https://medium.com/@al-e-shevelev/how-to-prevent-multiple-clicks-in-android-jetpack-compose-8e62224c9c5e코루틴에 기반을 둔 방법이 있다. 이 방식에서는 SharedFlow를 생성
ConstriantLayout으로 화면을 구성하다보면 화면의 정확히 반 부터 시작, 혹은 특정 비율에 따른 시작이나 크기를 주고 싶을 때가 있다.ConstraintLayout을 이용하면 왠만한 상황에 대처하기 쉽지만화면의 절반부터 시작하려면 비율을 이용하면 좋다.코틀린
listadapter에서 api call 없이 업데이트 해보자 !
댓글.... 대댓글.... 대대댓글....대대대대대댓걸..
jetpack compose에서 override backpressed!!
if(앱 설치){앱 실행}else{앱 설치하는 플레이스토어로 연결}
TDD랑 BDD에 맛을 봐보자
SharedPreferences에 머무르지 말고 DataStore를 사용해보자 !
이미지뷰를 좀 더 자유롭게 !
Flow에 대해서 조금 더 자세히
Glide와 Picasso의 차이점
TextView vs EditText
Glide는 구글에서 지원하는 공식 라이브러리이다.
당연히 할줄 알아야지 디버깅
Context란 무엇인가? require vs get은 무슨 차이가 있을까?
ViewModelScope , LifeCycleScope, CoroutineScope
이미지를 겹치는 여러가지 방법중 한가지
리사이클러뷰 내부에서 리사이클러뷰를 포함하는 경우 바깥의 리사이클러뷰의 현재 보여지는 포지션이 내부에 전달이 되어야 하는 경우가 있다.이 경우 현재 디스플레이에서 보여지는 position이 몇번째 포지션인지 확인 후 내부 어댑터에 이벤트를 넘겨주어야 하는 상황이 생기고
안드로이드에서 동영상을 다루게 된다면 대부분이 사용하는 Exoplayer이다.Exoplayer는 많지 않은 설정으로 동영상을 재생시킬 수 있고(대부분은 Glide처럼 Exoplayer의 load하는 부분에 동영상 url만 넣어주면 실행이 된다.)VideoPlayerMa
안드로이드 뷰의 갱신
안드로이드 스튜디오 버전 올려야지.