본문 바로가기

분류 전체보기

(70)
[Android] RecyclerView 에서 엣지 스크롤 이펙트 숨기기 리사이클러뷰의 맨 첫번째 또는 마지막 요소에서 스크롤(오버스크롤)할 경우 발생하는 이펙트를 숨겨야하는 요구사항이 있었다. 그래서 검색해보면, 대부분 리사이클러뷰에 android:overScrollMode="never" 속성을 적용하면 해결할 수 있다고 나와있다. 실제로 이 속성만 추가해주면 해당 이펙트는 사라진다. 하지만 이 속성을 적용할 경우 오버스크롤 모드가 비활성화 되기 때문에, 오버스크롤이 필요한 경우에는 적용하면 안되는 방법이다. 그래서 오버스크롤 모드가 필요한 경우에 아래와 같은 방법으로 해주면 된다. (이것저것 해보다가 발견한 것이고, 잘 알려진 방법이 아니기때문에 다른 사이드이펙트가 발생할 수 있으니 주의!!) recyclerView.edgeEffectFactory = object : Re..
[Android] Thread-safe 하지 않은 SimpleDateFormat 프로젝트를 작업하는 중에 서버에서 날짜의 형태를 UTC 포맷으로 내려주고있어서 변환이 필요했다. 대부분 UTC 포맷으로 내려오고 자주 사용될 여지가 있다고 생각해서 Dateutils.kt 파일에 global function 으로 UTC 관련 유틸을 만들어 사용하고있었다. typealias UTC = String private const val defaultUTCFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'" private val utcDateFormat = SimpleDateFormat(defaultUTCFormat, Locale.ROOT).apply { timeZone = TimeZone.getTimeZone("UTC") } private const val defaultKSTFo..
[Android] Caused by: java.lang.IllegalArgumentException: The style on this component requires your app theme to be Theme.MaterialComponents (or a descendant). Caused by: java.lang.IllegalArgumentException: The style on this component requires your app theme to be Theme.MaterialComponents (or a descendant). 머티리얼 컴포넌트 테마도 extend 하려고했더니 없다면서 안되고, 이미 있는 테마 갖다쓰려니 똑같이 안되고결국 공식 문서에 다 나와있었는데 영어 해석이 안돼서 삽질이 오래됐다;;; 공식문서 : https://material.io/develop/android/docs/getting-started/ 그래들도 추가하고 하라는거 다했는데 중요한 4번을 빼먹어서 문제였다.4. Change your app theme to inherit from a M..
[Design pattern] Adapter pattern Adapter Pattern 어댑터 패턴은 클래스의 인터페이스를 사용자가 기대하는 다른 인터페이스로 변환하는 패턴으로, 호환성이 없는 인터페이스 때문에 함께 동작할 수 없는 클래스들이 함께 작동하도록 해준다. (출처:위키백과) 아래 사진으로 보면 클래스의 인터페이스 - Client, 다른 인터페이스 - Adaptee 로 보면 된다. 어댑터 패턴은 이미 구축되어있는 것을 새로운 어떤 것이 사용할 때 양쪽 간의 호환성을 유지해주기 위해 사용한다. 기존의 로직을 그대로 이용할 수 있도록 중간에 변환기를 만든다는 느낌으로 이해하면 된다. 어댑터 패턴을 구현하는 방식은 아래와 같이 두가지가 있다. 클래스 방식 : 어댑터 클래스에서 기존 클래스를 extends 하고, 인터페이스를 implements 하는 방식이다...
[Design pattern] Singleton pattern Singleton Pattern Singleton Pattern 단 하나의 인스턴스만 생성해 사용하는 디자인 패턴. 같은 인스턴스가 필요할 때 기존에 생성된 인스턴스를 사용하도록 함. 이렇게 인스턴스를 유일하게 사용해야하는 경우가 언제인지는 직접 파악해야한다. 싱글톤 패턴을 쓰는 이유 단 한번의 new로 생성하여 고정된 메모리 영역을 얻기 때문에, 메모리 낭비를 방지할 수 있다. 싱글톤으로 만들어진 인스턴스는 전역 인스턴스이기 때문에 다른 클래스와 데이터를 공유하기가 쉽다. 하지만 인스턴스가 너무 많은 일을 하거나 많은 데이터를 공유시킬 경우 결합도가 높아져 개방-폐쇄 원칙을 위배하게 된다(객체 지향 설계 원칙에 어긋남). 자바에서는 생성자를 private으로 선언하여 new 를 사용한 객체 생성이 불가..
[Design pattern] Builder pattern Builder Pattern Builder Pattern 빌더 패턴은 추상 팩토리 패턴이나 팩토리 메소드 패턴처럼 새로운 객체를 만들어서 반환하는 패턴이긴 하지만 실제 동작 방식은 조금 다르다. 빌더 패턴은 생성자에 들어갈 매개 변수가 많든 적든 차례차례 매개 변수를 받아들이고, 모든 매개 변수를 받은 뒤에 이 변수들을 통합해서 한번에 사용한다. Builder pattern으로 해결할 수 있는 것 불필요한 생성자를 만들지 않고 객체를 만든다. 데이터의 순서에 상관 없이 객체를 만들어 낸다. 사용자가 봤을때 명시적이고 이해할 수 있어야 한다. builder pattern의 예시 Retrofit Observable Glide, Picasso … 참고 : 빌더 패턴(Builder Pattern), [patte..
[Design pattern] Observer pattern Observer Pattern Observer Pattern 상태를 가지고 있는 주체 객체와 상태의 변경을 알아야 하는 관찰 객체(Observer Object)가 존재하며 이들의 관계는 1:1이 될 수도 있고 1:N이 될 수가 있다. 서로의 정보를 넘기고 받는 과정에서 정보의 단위가 클 수록, 객체들의 규모다 클 수록, 각 객체들의 관계가 복잡할 수록 점점 구현하기 어려워지고 복잡성이 매우 증가할 것이다. 이러한 기능을 할 수 있도록 가이드라인을 제시해 주는 것이 바로 옵저버 패턴이다. 옵저버 패턴은 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들에게 연락이 가고 자동으로 정보가 갱신되는 1:N 의 관계를 정의한다. 연결은 인터페이스를 이용하여 느슨한 결합성을 유지한다. 주체, 옵저버 인터페이스..
[2019.01.01-02] 뉴스 크롤링 앱을 만들면서..(3) 오늘 구현한 것- 두개의 리사이클러뷰 각각에 Progress bar 로 데이터 로드 상태 보여줌- swipe represh 추가. 참고 : https://medium.com/@bluesh55/android-당겨서-새로고침-간단하게-구현하기-a42846c14c23- 위젯 기능 추가하는 중. 일단 위젯이 생각보다 까다로운 녀석이라는 것을 이번에 처음 알게됐다.기존 방식과는 다르게 위젯은 다른 프로세스에서 뷰를 인플레이트 하는 과정을 거치는, 기생(?)하고 있는 구조라고 한다. (참고 : http://itmir.tistory.com/551)그리고 브로드캐스트를 받아 처리하는 방식으로 위젯 데이터가 갱신되는 것 같다.또한 위젯을 만드는 과정이 은근히 복잡하다...!! 아래 순서는 내가 마음대로 매겨봤다.1. r..