android 6

<include/>로 레이아웃 재사용하기

특정 뷰를 재사용해야 될 때가 있다. 예를 들어 이런 경우. 내 프로젝트에 사용되는 edittext 이다. edittext의 이름과, edittext 박스가 반복되고 있다. 다른 카테고리로 넘어가면 또 새로운 edittext의 이름과, edittext 박스를 반복해야 한다. 키워드를 이용해 이처럼 반복되는 레이아웃을 재사용해 보자. 우선 반복되는 레이아웃을 하나의 레이아웃 파일로 만들어준다. edittext_add_edit.xml 그다음, 필요한 레이아웃에서 이 재사용될 레이아웃을 포함시키면 된다. fragment_add_movie.xml //재사용될 코드 이외의 코드 //... 데이터 바인딩으로 값 넣어주기 그러나 이렇게만 해서는 뷰는 재사용할 수 있지만 textView의 text, editText의 ..

Firebase Google Sign In / ApiException: 10 해결하기

이틀 내내 .. 이 exception을 해결하느라 머리가 터지는 줄 알았다. 거의 모든 검색어의 모든 글들을 읽어봤는데도 해결되지가 않았다. 가장 많이 언급된 문제는 SHA1 이 일치하지 않기 때문이라는 것, 다음으로는 디버그 키와 릴리즈 키를 둘 다 등록해주어야 한다는 것. 이 모든 것을 충족했는데도 에러는 계속 뜨고.. 새로운 해결방안은 더이상 나오지 않고.. 이 두 경우만 끊임없이 보던 와중 다른 류의 답변을 찾았다!! https://stackoverflow.com/questions/47437678/why-do-i-get-com-google-android-gms-common-api-apiexception-10 Why do I get com.google.android.gms.common.api.Api..

무한 스크롤 (feat. paging3)

영화 검색 기능을 만들 때, 나는 검색어를 입력하면 해당 결과로 데이터를 30개만 받아와 30개만 화면에 띄우도록 했다. 그런데 이 방법은 만약 찾는 영화가 31번째 이후에 나오게 되면 문제가 된다. 또 만약 상위 5개만 확인하고 말면 이 또한 자원 낭비다. 그래서 개수에 한계를 두지 말고 일정 갯수만큼 계속해서 불러오는 무한스크롤을 만들기로 했고, paging3 라이브러리를 사용하기로 했다. paging3 페이징 라이브러리 개요 | Android 개발자 | Android Developers페이징 라이브러리 개요 Android Jetpack의 구성요소 페이징 라이브러리를 사용하면 로컬 저장소에서나 네트워크를 통해 대규모 데이터 세트의 데이터 페이지를 로드하고 표시할 수 있습니다.develop..

앱 출시 전 가독화 파일 업로드, proguard 적용하기

앱을 출시해보기 전 내부 테스트라는 것을 해보기 위해 플레이콘솔에 Bundle을 업로드하였다. 그런데, 저장을 누르고 버전 검토를 하면 이런 경고가 뜬다. 이 App Bundle 유형과 연결된 가독화 파일이 없습니다. 이를 해결하기 위한 자세한 내용은 공식 문서를 확인하면 알 수 있다. 앱 축소, 난독화 및 최적화 | Android 개발자 | Android Developers 사용하지 않는 코드와 리소스를 삭제하기 위해 출시 빌드에서 코드를 축소하는 방법을 알아보세요. developer.android.com 앱을 최대한 작게 만들기 위해 필요 없는 코드와 리소스를 삭제하는데, 이 때 앱 크기를 최대한 축소하기 위해서 우리가 직접 만든 클래스나 멤버변수의 이름을 줄이는 난독화라는 과정을 거치고, 추가로 더..

실시간검색 기능 구현하기 (feat. flow, 양방향 데이터 바인딩)

영화를 검색할 때 검색 버튼을 눌러야만 검색되는 것이 아니라, 검색어를 입력하는 동시에 실시간으로 검색이 되도록 하고 싶었다. 그런데 무한반복문을 사용하게 되면 api 호출을 너무 많이 하게 된다. 예를 들어 김밥을 검색한다고 했을 때, 타자가 느린 사람이라면 ㄱ->ㄱ->ㄱ->기->기->김->김->김ㅂ->김ㅂ->김바->김바->김밥->김밥->김밥 이런 식으로 불필요한 호출이 너무 많이 일어나게 될 것이다. 그래서 입력이 없을 때만 검색을 실행하도록 coroutine flow의 debounce를 사용하였다. 검색어 변수를 flow로 만들어주었다. var searchValue = MutableStateFlow("") 그리고 edittext에서 변경되는 값이 실시간으로 searchValue에 반영되도록, 양방향..

데이터 바인딩 - 데이터가 변하는데 뷰는 안변하는 경우 (feat. lifecycleOwner)

데이터 바인딩을 처음 사용하는 나로써는.. 매우 난감한 문제였다. 분명히 필요한 변수도 다 넣어줬는데... 딱 하나 빼먹은 것이 있었다. lifecycleOwner를 설정해주지 않은 것!! lifecycleOwner를 설정해주어야 해당 lifecycle동안 뷰가 데이터를 관찰하고 있을 수 있다. MainActivity>onCreate val binding = ActivityMainBinding.inflate(layoutInflater) binding.lifecycleOwner = this 다 맞게 작성한 것 같은데, 뷰가 데이터가 변경되고 있다는 사실을 모른다면 lifecycleOwner를 빼먹지는 않았는지 확인해보자👍