본문 바로가기

ANDROID

(125)
[안드로이드 | MpAndroidChart] 바 그래프의 하단 영역이 생길 때의 대처법 그래프를 활용한 뷰를 만들면서 실제 데이터를 적용하기 이전에 랜덤 값으로 바 그래프 데이터를 만들어 보여주고 있었는데, 값이 바뀔 때마다 이상하게 바의 하단영역이 비는 현상이 생겼다. 이를 해결하기 위해 다양한 설정값을 먹여보았으나 잘 듣지 않았고, 얼마간의 시행착오를 거쳤는데 정답은 그래프의 min max 값을 정하는데에 있었다. 아래와 같은 설정 값을 먹인 뒤로 해당 현상은 사라지게 되었다. 차트.axisLeft.axisMinimum = 0f 이어 추가로 바 그래프를 설정한 뷰의 영역에 꽉 채우고 싶어서 자료를 찾아보았는데 잘 나오지 않았고 이윽고 스택 오버플로에 직접 질문을 하여 해답을 구할 수 있었다. 차트.setViewPortOffsets(0f, 0f, 0f, 0f) 다만 현재 문제점은 차트를 ..
[안드로이드 | 코틀린] 데이터바인딩을 사용할 때 Fragment 내의 View 좌표 가져오기 이번에 신규로 구현하는 페이지에서 유저의 터치에 따라 화면 내의 커서를 특정 위치로 보내야 하는 요구사항이 있었다. 터치를 받는 곳은 별도의 뷰에서 들어오는 것이었기에, 터치는 터치대로 Listen해 마찬가지로 별도의 뷰로 되어있는 인디케이터를 움직여야 했다. 이를 해결하기 위해 커서가 가장 좌측으로, 그리고 우측으로 최대한 움직였을 때의 위치를 더미 View를 사용해 지정하였고, 둘간의 좌표 차이를 활용해 커서를 수평이동 시키기로 했다. 서론은 이정도로 마치고 데이터바인딩된 Fragmet 레이아웃으로부터 특정 뷰의 좌표를 가져오기 위한 방법은 아래와 같다. ... val binding = DataBindingUtil.inflate(inflater, R,layout.fragment_layout, cont..
[안드로이드] ExoPlayer2 오류 : invoke-customs are only supported starting with Android O) invoke-customs are only supported starting with Android O) Defaut interface methods are only supported starting with Android N .. 영상 재생을 위한 ExoPlayer를 Implement하는 과정에서 위와 같은 오류가 발생했다. Stack Overflow에서 어렵지 않게 해결책을 구할 수 있었는데, 비슷한 오류를 겪은 사람들이 많았던 듯. 아래의 코드를 app레벨의 gradle 파일에 추가하자. android { ... compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 ..
[안드로이드] ConstraintLayout 내부에 Fragment 알맞게 배치하기 상단에는 페이지의 제목과 설정 아이콘 등을 넣을 수 있는 AppBar, 중앙에는 변경되는 Fragment들이 배치되는 FrameLayout, 하단에는 페이지 이동을 위한 BottomNavigationView가 들어가있는 크게 세 칸의 구성으로 된 레이아웃 구성을 진행중에 있었다. 여기서 문제가 하나 있었는데, 중앙에 배치되는 ConstLayout이 삐져나온다거나 꽉 차지 않아 기기간에 차이도 생기고, 디자인의 의도대로 앱이 보여지지 않는 불편한 경우가 생기는 것이었다. 이런 경우에는 ConstraintLayout의 width와 height 설정이 중요한데, 아래와 같은 과정을 통해서 본래 의도에 맞게 중간 영역에 알맞게 Fragment의 뷰가 가득 차게 구현할 수 있었다. 1. Fragment를 뿌리는 ..
[안드로이드] 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..
[안드로이드] 데이터바인딩을 Fragment에 적용할 때의 유의할 점. 신규 앱 프로젝트를 진행하면서 좀 더 효율적인 개발을 위해 데이터바인딩을 도입하게 되었다. 헌데 데이터바인딩을 활용한 Fragment를 구현할 때, Fragment의 뷰만 보이고 기능적인 요소들이 적용되지 않는 문제가 있었다. 해결점은 onCreateView에 있었는데, 기존에 view를 리턴해주던 default 코드를 binding.root로 변경해주어야만 하는 것이었다. (간단..)
[안드로이드] 사용자 기기의 글꼴 사이즈에 앱 대응하기 어떤 UI/UX 가이드라인에 맞추어 설계한 앱의 경우에도 사용자가 임의로 기기의 폰트 사이즈를 변경하거나, 혹은 크거나 작게 사용하고 있는 경우에는 기존의 의도와 다르게 앱의 몇몇 뷰들이 겹치거나 텍스트가 잘려보인다는 등의 현상이 발생하기 마련이다. 이와 같은 경우, constraintLayout으로 구성되어 있는 레이아웃들을 전부 손봐서 기본 폰트 사이즈의 경우 기존 UI/UX 가이드라인에 알맞게 보여지도록 하고, 큰 폰트 사이즈를 사용할 경우 잘려나가는 부분이 없도록 최소한의 조정을 하는 방안이 있었는데, 몇몇 뷰 요소에 엄격하게 들어가있는 width 값들이 있어 손대기가 조금 난해한 부분이 있었다. 그래서 다르게 생각하기로, 기존 가이드라인이 노령 연령대를 고려해 맞추어진 UI/UX라면 (큰 폰트사..