목록안드로이드/안드로이드 개발 (64)
우찬쓰 개발블로그
디자인에 따라서, 성능상 안좋지만 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..
spinner를 누르게되면 기본적으로 navigation bar가 튀어나오게 되어있다. 하지만 fullscreen으로 작업해야 되는 작업자 입장에선 곤혹이다. 이럴경우 어떻게 해주면 될까? stack over flow에선 다 너무 복잡하고, 제대로 되지 않는 방법만을 알려주기에, 포스팅한다. spinner에서 사용하는 ArrayAdapter에서 getDropDownView를 override하여 다음과 같이 처리한다. override fun getDropDownView(position: Int, convertView: View?, parent: ViewGroup?): View { //hideNavigationBar return super.getDropDownView(position, convertView,..
에전에는 assets 폴더에 폰트를 넣었지만, 요즘엔 res폴더에 폰트를 넣기도 한다. 그런데 이런 경우, 기존방식으로는 코드상으로 폰트를 넣지 못한다. 예전에는 다음과 같이 코드상으로 폰트를 넣어줄 수 있었다. val face = Typeface.createFromAsset(assets, "fonts/your_font.ttf") tv.typeface = face 당연하게도, res 폴더에 font를 넣었다면 이젠 assets 폴더가 아니니 이 방법은 되지 않는다. 그렇다면 res 폴더에 폰트를 넣은 경우는 어떻게 해야할까? val face = ResourcesCompat.getFont(context, R.font.your_font) tv.typeface = face res폴더에 폰트를 넣은 경우는 자동..
보통 메인엑티비에서 와이파이의 현재 연결 상태를 체크할 수 있도록 해달라는 요구사항이 들어올때가 있다. 백그라운드의 서비스단에서 처리해달라고하면 골치아파지지만, 단순히 엑티비티 내부에서 처리하려면 간단하다. 간단하게 사용할 수 있도록 클래스를 하나 직접 만들어 보자. class ConnectionStateMonitor(val activity: Activity, val onConnected: () -> Unit, val onDisconnected: () -> Unit) : NetworkCallback() { private val networkRequest: NetworkRequest = NetworkRequest.Builder().build() init { registerConnectionMonitor(a..
안드로이드 개발을 하다보면, 예쁜 애니메이션을 넣어달라고 요청이 들어오곤 한다. 왠만한 애니메이션들은 이미 라이브러리로 많지만, 간단히 레이아웃을 움직여 달라는 요청들은 직접 구현을 해야하는데, 그럴경우 어떤 방법으로 애니메이션을 구현하는게 가장 좋을까? 구식 방법으로는 다음과 같은 방법이 있었다. TranslateAnimation anim = new TranslateAnimation(0, amountToMoveRight, 0, amountToMoveDown); anim.setDuration(1000); anim.setAnimationListener(new TranslateAnimation.AnimationListener() { @Override public void onAnimationStart(Ani..