목록안드로이드 (77)
우찬쓰 개발블로그
공공데이터 날씨 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..
다국어 앱을 만들다보면, 유저가 입력한 문자열이 무슨 언어인지 알아야 할 때가 있다. 필자의 경우 번역기를 만드는데 해당 유저가 태국어를 입력한 것인지, 영어를 입력한 것인지, 한글을 입력한 것인지 알아야 했다. 관련 라이브러리를 찾아보니 성능적인 문제도 있고, 내가 필요한 언어만 지원하게 만들어 두지 않아서 마음에 들지 않았다. 그럼 간단하게 언어를 감지하는 법을 알아보자. 기본적으로 UTF-8 이라는 가정하에 진행한다. fun isProbablyEnglish(s: String): Boolean { var i = 0 while (i < s.length) { val c = s.codePointAt(i) if (c in 0x0041..0x007A) return true i += Character.charC..
큰 파일을 다운로드하여 안드로이드 저장소에 넣어야 하는 경우, 유저의 네트워크 상황에따라 오래 걸리는 경우가 있을 수 있다. 이런 경우를 대비하여 유저 편의성을 위해 progress bar를 표시해주어야 하는데, 직접 하나하나 구현해 보도록 하자. 1. 먼저 간단하게 Retrofit Service 클래스를 만든다. interface RetrofitService { /** * 파일 요청. */ @GET("테스트 파일이 있는 url path") fun requestFile(): Flowable } 가볍게 하기위해 API 요청시 필요한 데이터는 없다고 가정한다. 2. 이 파일을 내려받는 과정에서의 진행도를 노티받기 위하여 ResponseBody를 상속받은 클래스를 하나 만들어야한다. class Progress..
안드로이드를 개발하다보면 유선으로 adb를 설정할 수 없는 상황이 생기기도 한다. 예를들어 필자의 경우, 태블릿에 usb로 IOT 보드를 연결하고 디버깅해야하는데 usb포트가 하나이다보니 adb를 유선으로 할 수가 없었다. 이런경우를 위하여 adb 원격 설정을 해보자. 먼저 안드로이드 기기에 유선으로 adb 연결후 터미널에 다음과 같이 명령어를 입력한다. adb tcpip 5555 여기서 5555는 포트번호를 의미하는데, 원하는 포트로 설정한다. restarting in TCP mode port: 5555 라는 메시지가 나오면 성공적으로 설정된 것이다. 그다음 현재 PC와 같은 공유기 와이파이(혹은 이더넷이라도)에 연결한 후 해당 디바이스의 ip 주소와 포트번호를 이용하여 adb connect를 시도한다..
안드로이드 앱을 개발하다보면, 여러가지 상황에서 (토큰만료, 로그아웃 버튼 등) 로그아웃 로직을 구현해야 한다. 직접 하나하나 activity를 종료해가며 구현하는 짓을 하는 사람은 없을 것이라 보고, 그렇다면 함수 하나로 모든 activity를 종료하고 로그인 activity를 시작하게 하는 방법은 없을까? 그래서 구현해봤다. /** * 강제 로그아웃. */ fun executeSignOut() { UserRepository.INSTANCE.deleteUserData() // 유저 데이터 삭제 val context = TestApplication.getApplicationContext() val intent = Intent(context, SignInActivity::class.java) intent...