본문 바로가기

코틀린

(17)
[안드로이드 | 코틀린] 코틀린으로 Queue 사용해보기 프로젝트에서 요구사항 구현을 위해 코틀린의 Queue 클래스를 활용해보기로 했다. Queue는 기본 java.util 패키지 내에 포함되어 있으며, Queue를 사용하면 IDE가 java.util.* import를 새롭게 추가하는 것을 확인할 수 있을 것이다. 그럼 Queue를 쓸 때에 사용 가능한 function을 살펴보자. - add(element: E) Any type의 element를 Queue에 추가한다. Any는 코틀린의 모든 클래스의 최상단 super 클래스로, 결국 어떤 클래스든지 문제없이 사용이 가능하다는 것이다. Queue에 element를 더하는데 성공하면 true를 return하며, 실패시 IllegalStateException을 발생시킨다. - element() element()는..
[안드로이드] CountDownTimer의 시간 Sync 문제 해결하기 프로젝트에서 MediaPlayer와 CountDownTimer를 사용하면서 몇가지의 애로사항이 있었는데, 이를테면 영상을 중지하고 다시 재개할 때의 기존의 타이머를 어떻게 다시 설정하냐는 것이었다. 왜냐하면 CountDownTimer에는 별도의 pause 기능이 없고, stop만이 가능했기 때문이다. 우선 기존의 요구사항은 아래와 같다. MediaPlayer는 10개의 영상을 연달아 재생한다. 각 영상은 각기 다른 재생시간을 가진다. 영상은 10초의 대기시간을 가진 뒤 재생을 시작한다. 사용자는 대기시간 및 재생중에도 상관없이 일시정지 및 다시시작(resume)이 가능하다. 일시정지 및 다시시작, 재생을 진행하는데 모든 타임라인이 일치하여야 한다. (남은 시간, 경과 시간 등) 여기서 포인트는 일시정지 ..
[안드로이드 | ExoPlayer] EventListener를 활용해 여러개의 동영상 연달아 재생하기 ExoPlayer를 동영상 재생에 쓰던 중에 여러개의 영상을 연달아 보여줘야 하는 요구사항이 생겼다. 이를 위해 일전에 에셋을 리스트 형태로 만들어 다른 용도로 썼던 것을 떠올려 구현을 해보기로 했다. 1. ExoPlayer Initialize 2. 비디오 에셋 resourceList 설정 3. ProgressiveMediaSource ArrayList에 차례대로 resourceList를 로딩해 add 4. Player.EventListener Initialize 5. ExoPlayer에 listener add 6. ExoPlayer.setShutterBackgroundColor(Color.TRANSPARENT) 7. 영상을 차례대로 재생하는 플레이어 감상 - 기본 설정 ..
[안드로이드 | 코틀린] 데이터바인딩을 사용할 때 Fragment 내의 View 좌표 가져오기 이번에 신규로 구현하는 페이지에서 유저의 터치에 따라 화면 내의 커서를 특정 위치로 보내야 하는 요구사항이 있었다. 터치를 받는 곳은 별도의 뷰에서 들어오는 것이었기에, 터치는 터치대로 Listen해 마찬가지로 별도의 뷰로 되어있는 인디케이터를 움직여야 했다. 이를 해결하기 위해 커서가 가장 좌측으로, 그리고 우측으로 최대한 움직였을 때의 위치를 더미 View를 사용해 지정하였고, 둘간의 좌표 차이를 활용해 커서를 수평이동 시키기로 했다. 서론은 이정도로 마치고 데이터바인딩된 Fragmet 레이아웃으로부터 특정 뷰의 좌표를 가져오기 위한 방법은 아래와 같다. ... val binding = DataBindingUtil.inflate(inflater, R,layout.fragment_layout, cont..
[안드로이드] Exo Player에서 발생하는 java.net.MalformedURLException: unknown protocol 해결 Exo player 셋업을 마치고 player에 Uri 파일을 넘겨주는 과정에서 java.net.MalformedURLException: unknown protocol 에러가 발생하였다. player에 넘겨주고자 했던 건 프로젝트의 리소스 폴더 내 raw 폴더에 넣어둔 mp4 파일이었는데, 기타 다양하게 나와있는 Uri 생성 방법으로 해보았으나 실패하였고, 결론적으로 아래의 방식을 통해 문제를 해결할 수 있었다. val rawDataSource = RawResourceDataSource(context) rawDataSource.open(DataSpec(RawResourceDataSource.buildRawResourceUri(R.raw.sample_video))) val videoSource = Prog..
[안드로이드] 데이터바인딩(DataBinding)을 사용할 때 include한 레이아웃의 View 참조하기 기존 프로젝트의 레이아웃이 다수의 레이아웃이 include된 뷰를 포함하고 있었는데, 기존 코드가 include 된 레이아웃의 뷰를 참조하고 있었고, 이를 개별적으로 새로운 data binding 객체로 만들어 참조해 대체해보려 했지만 대실패하였다. 그런 한두시간의 삽질 뒤 찾은 대안이 있었는데, 대안은 아래와 같다. 1. include로 포함된 뷰를 가진 레이아웃의 data binding 클래스로부터 include된 레이아웃의 id를 우선 참조 예) private lateinit var mainActivityBinding : MainActivityBinding .. { ... mainActivityBinding = DataBindingUtil.setContentView(this, R.layout.mai..
[GDG Seoul | 코틀린 ] Kotlin / Everywhere Seoul 2019에 가다 [1부] 넌지시 마음에 품던 개발 컨퍼런스를 그동안 못 가보다가, 이제 개발 2년차에 접어든 시기에 처음으로 GDG Seoul에서 주최하는 개발 컨퍼런스에 참가하게 되었다. 열심히 공부해서 손에 익히고자 했던 코틀린을 어느새 주 랭귀지로 개발하게 된 중에 코틀린 관련 컨퍼런스가 열린다는 사실은 적잖이 반가울 수 밖에 없었다. 프로그램은 Kotlin의 현재와 앞으로의 미래를 간략히 그리는 Svetlana lsakova 님의 1부 세션, 그리고 Kotlin에 대해 좀 더 구조적인 깊이를 안내해주셨던 Pluu님의 2부 세션으로 이루어져 있었다. 2부로 구성된 간략한 세션이었지만, 코틀린의 초보, 중수의 레벨에서 앞으로 '무엇을 배워야'하는지, 그리고 앞으로 코틀린이 나아갈 로드맵에 대해서도 알 수 있는 유익한 컨퍼런스..
[안드로이드/Kotlin] Activity에서 Fragment의 요소를 제어하자 처음에는 Fragment 제어를 위해 interface를 구현해 listener를 만드는 등 복잡한 절차를 거치려 하고 있었는데, interface를 쓰지 않고 아주 간단하게 Fragment의 요소를 제어할 수 있는 방법을 발견했다. 내가 하고자 했던 일은 Fragment에 구현된 RecyclerView를 refresh하는 것이었는데, 아래 과정을 통해 이를 해결할 수 있었다. 1. Fragment에 refresh를 수행하는 메소드를 추가 fun doSomething() { } 2. Activity에서 Fragment를 참조 val fragment : Fragment클래스 = supportFragmentManager.findFragmentById(R.id.프래그먼트컨테이너) as Fragment클래스 3..