목록안드로이드 (75)
우찬쓰 개발블로그
quit() : 즉시 루퍼 종료. quitSafely()는 : 메시지 큐에 쌓인 메시지 전부 처리후 루퍼 종료.
보통의 체크박스는 다음과 같다. 보통 여기서 디자인을 넣게되면 다음과 같이 작업을 하곤한다. 이렇게 커스텀으로 이미지를 사용해야하는 경우 android:button="@drawable/custom_image" 를 통해 넣게되는데, 이 방식으로 체크박스 이미지를 변경하는 경우 문제점이 하나 있다. 백그라운드도 또한 체크여부에 따라 디자인이 바뀌어야 되는경우, 정상적인 방법으로는 저 앞에 부분의 공간을 띄울 수가 없다. 이 경우엔 어떻게 해야할까? 이러한 경우를 위해서는 android:button 이 아니라 android:drawableStart에 이미지를 넣어주어야한다. 기존의 button은 @null을 통해 제거한다. background와 체크박스 이미지 사이의 공간은 paddingStart를 통해 조절..
스크롤뷰는 참 편리하지만 가끔씩 원하는 로직의 구현이 어려울 때가 있다. 대표적 예중에 하나가 스크롤뷰 내부에 뷰를 하단에 고정하는 것이다. 다음과 같은 뷰가 있다고 가정해보자. 여기서 요구사항은 '고객센터' 라는 버튼을 최하단에 고정시키기 이다. 각 안드로이드 폰마다 해상도가 다르기 때문에 정확한 방법을 알지 않고는 구현하기가 어렵다. 예를들어서 고객센터를 제외한 부분을 스크롤뷰로 잡고 상위 레이아웃을 Relative Layout으로 잡게되면, 언뜻 성공한것처럼 보이지만 키보드가 올라온 경우 다음과 같은 슬픈 결말을 맞이하게 된다. 우리의 정확한 요구사항은 다음과 같다. 1. 스크롤뷰의 내부가 내용물이 적을 경우에도 하단뷰는 하단에 고정. 2. 스크롤뷰가 스크롤을 넘칠정도로 내용물이 생길 경우에는 하단..
보통 enum class로부터 정의된 값을 찾는다. enum class Test(val value: Int){ A(0), B(1), C(2) } 그런데 0으로 부터 A라는 enum을 찾으려면 어떻게 해야할까? 이를 위해서는 새롭게 fun을 만들어야 한다. object FindTestByValue { private val map = Test.values().associateBy(Test::value) fun fromValue(value: Int) = map[value] } 이렇게 funtion을 구성한 뒤에 fromValue를 호출해서 쓰면 된다. FindTestByValue.fromValue(0) // Test.A가 리턴됨
디자인에 따라서, 성능상 안좋지만 NestedScrollView안에 RecyclerView를 wrap_content로 넣어야 할때가 있다. 이 경우, RecyclerView의 아이템 갱신시 RecyclerView로 포커스가 자동으로 이동하면서 스크롤 되는 경우가 있다. 이럴때는 NestedScrollView의 바로 자식인 layout에 android:descendantFocusability="blocksDescendants" 를 넣어주도록 하자.
안드로이드 스튜디오로 넘어오면서, 보통 라이브러리들이 다 aar파일(Manifest가 포함된 안드로이드 전용 라이브러리) 로 제공되지만, 옛날 이클립스 시절에는 java파일만 포함된 jar파일로 라이브러리가 만들어 졌었다. 예전의 jar 라이브러리들도 잘 만들어진 것들은 아직도 쓰는 경우가 많은데, 간단하게 프로젝트에 추가해보자. 1. 먼저 project의 보기 방식을 project로 바꾸고, 혹은 직접 폴더로 가서 app/libs 에 jar파일을 넣는다. 2. app수준의 gradle에 다음과 같이 추가한다. dependencies { ... implementation files('libs/YourJarFile.jar') ... } 3. 그리고 sync를 돌려주면 바로 사용이 가능하다.
앱 개발을 하다보면 GPS를 사용하여 위경도 값을 얻어와야 하는 경우가 있다. GPS 위치 모드 설정에 따라서 GPS의 측정정확도가 다른데 기본적으로 측정정확도는 디폴트가 '기기전용'으로 되어있다. 안드로이드 설정에서 위치 모드로 들어가면 세가지 종류가 있는데, 그 세가지는 다음과 같다. 높은 정확성(GPS, Wifi, 블루투스, 이동통신망) 배터리 절약(Wifi, 블루투스, 이동통신망) 기기 전용(GPS만 이용) 당연히 GPS 값을 가장 잘 얻어오는 모드는 높은 정확성 이다. 그래서 앱에서 GPS 값을 잘 가져오기 위해서는 높은 정확성으로 바꿔주는 것이 중요한데, 이게 생각보다 샘플코드를 찾기가 어려웠다. 결론적으로는 아래와 같은 코드를 짜게 되었다. 먼저 gradle에 라이브러리를 추가해주어야한다. ..
안드로이드 개발을 하다보면, 알림이나 푸시등이 왔을때 화면이 꺼져있어도 켜주어야 하는 상황이 생긴다. 이 경우는 어떻게 해야할까? 검색해보면 다양한 방법이 있지만, 가장 짧은 소스는 다음과 같다. val pm = getSystemService(POWER_SERVICE) as PowerManager val wLock = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK or PowerManager.ACQUIRE_CAUSES_WAKEUP or PowerManager.ON_AFTER_RELEASE, "myapp:TAG") wLock.acquire()
공공데이터 날씨 API를 연동하다보니 gps데이터 및 주소 데이터를 가져와야 하는 일이 생겼다. 관련 자료를 찾아보니 너무 다들 복잡하게 코드를 짜고 있어서 직접 GpsManager를 하나 만들어 보게 되었다. 먼저 유의해야할 점은, 안드로이드는 보통 Gps와 Wifi로 부터 위치 정보를 받아오는데, 안드로이드 기본 설정에서 위치 가져오기 모드가 Gps로만 되어있다면 네트워크로 부터 위치정보를 받아올수가 없다. 그래서 이 부분은 꼭 네트워크과 gps 둘 다로부터 위치정보를 가져오게 바꾸도록 하자. 그다음 GpsManager 소스이다. /** * Created by WoochanLee on 2019-06-26. */ class GpsManager(val context: Context) { var locat..
비밀번호 변경 등의 기능을 구현하다보면 패스워드 입력시의 가려지는 문자에도 디자인이 들어가는 경우가 있다. 이런 경우에는 어떻게 바꾸어주어야 할까? 간단히 예제로 해당 동그라미 문자를 #으로 바꾸어 보자 먼저 CharSequence 클래스를 상속받는다. class CustomCharSequence(private val source: CharSequence): CharSequence { override val length: Int get() = source.length override fun get(index: Int): Char { return '#' } override fun subSequence(startIndex: Int, endIndex: Int): CharSequence { return sour..