목록전체 글 (172)
일모도원(日暮途遠) 개발자
구글 플레이에 앱을 올리니 아래와 같은 워닝이 나온다. The developer of Google Mobile Ads (GMA) SDK (com.google.android.gms:play-services-ads) added the following note to SDK version 19.3.0:This version is officially deprecated, and will soon disable ad loading. Please update to a new version. See https://developers.google.com/admob/android/deprecation for more details. 내 코드를 보면 아래처럼 19.3.0을 쓰고 있다. implementation 'com...
리스트가 600개 정도 되는데 이게 전부 다 어댑터에서 binding이 되고 있어서 무척 느리다. 삽질 끝에 소스코드가 아닌, 레이아웃쪽에 문제가 있다는걸 알았다. 원인은 아래 코드가 문제였다. 저 코드로 인해서 리사이클 뷰의 높이가 제대로 안구해져서 어댑터에서 높이에 해당되는 아이템만 바인딩하는게 아니라 리스트내의 모든 아이템을 바인딩 해서 오류가 발생했다. (왜 저코드가 문제인지는 정확히는 잘 모르겠다...) 안되는거 아래처럼 고치면 바인딩이 이슈는 해결되지만 UI문제가 생긴다. 즉 이런씩으로 BottomNavigationView가 일부 잘려져 나온다. 내경우에는 ConstraintLayout 안에 다시 ConstraintLayout으로 레이아웃을 만들지 않아도 되어서 안에서는 그냥 LinearLay..
초창기 아이폰을 사용할때, 삼성이 안드로이드 장점으로 내세우던 것중 하나가 SD카드를 통해서 저장공간을 확장할수 있다는거였다. 안드로이드 개발을 시작할때 내부(internal) 저장공간, 외부(external) 저장공간 이라고 말할때, 나는 외부가 저 SD카드처럼 폰에 삽입해서 저장공간을 늘리는걸 말하는줄 알았다. 안드로이드 스튜디오에서 보면 이름이 떡하니 "sdcard"로 되어 있다. 근데 내 폰에는 sd카드가 없는데? 챗GPT에게 물어보니 요즘은 물리적인 sd카드를 안쓰는 추세이지만, 이전과 호환을 위해서 쓰는 이름이라고 한다. 4.0(아이스크림 샌드위치)까지는 물리적인 SD카드를 가리키는 이름이었다고 한다. 그리고 사실 저 sdcard폴더는 심볼릭링크로 나의 경우는 /storage/self/prim..
가끔 Ctrl+Shift+F (Cmd+Shift+F) 로 검색할때 쓸데 없는 mapping.txt나 seeds.txt등에서 검색결과가 같이 나올때가 있다. 이걸 제외할려련 Scope을 사용하면 된다. (Dolphin버전임) Find in Files에서 Scope을 누르자. 아래와 같은 창이 나오면 좌측의 + 버튼을 누른다. Scope은 Local은 현재 프로젝트에만 적용할거고, Shared를 하면 모든 프로젝트에 적용할거다. 이름을 적당히 주자. 예를 들어 Exclude useless files Pattern이 비어있을거다. 패턴에서 안보고 싶은 파일명을 적어주자. !file:mapping.txt&&!file:seeds.txt 이제 검색시 "In Project"가 아니라, "Scope"에서 아까 정의한 ..
채팅UI용 오픈소스를 쓰면 되는데, 쓰는데도 공부할 시간이 필요해서 간단한 기능만 일단 만들어 보고 있다. 문제는 채팅 내용이 있는 리사이클 뷰를 키보드가 가리는 현상이다. 구글 검색해보니 "adjustResize"를 manifest에 추가하면 된다는 글도 있었지만, 나는 이미 반영되어 있다. android:windowSoftInputMode="stateAlwaysHidden|adjustPan|adjustResize" 챗GPT에게 물어봤지만 해결이 안되었다. 겨우 검색해서 찾아서 다음 한줄로 해결했다. 리사이클뷰에 addOnLayoutChangeListener를 추가하고 레이아웃이 바뀌면 리사이클 뷰의 맨 마지막으로 스크롤하게 만들었다. binding.rvChatGpt.addOnLayoutChangeLi..
챗GPT API를 쓰는 앱을 개발중에 릴리즈모드에서만 죽는 현상이 발견되었다. 에러로그가 이렇게 알아보기 힘들게 나온다. 다행히 ".NoSuchFieldException: system"라는 문구로 어디가 문제인지는 파악이 된다. E/AndroidRuntime: FATAL EXCEPTION: main Process: com.dalnimsoft.araconv, PID: 17238 java.lang.AssertionError: java.lang.NoSuchFieldException: system at f.h.g.r.k.n$j0.(:792) at f.h.g.r.k.n$w.a(:818) at f.h.g.d.k(:458) at f.h.g.r.k.i.b(:117) at f.h.g.r.k.i.e(:166) at f.h..
아래처럼 채팅창을 구현하고 있다. 원하는것은 상대방 채팅일때 약간 왼쪽으로 쏠린듯한 느낌을 주게, 시작마진은 8, 끝마진은 30으로 줬다. 근데 문제는 글자가 길어지면 아래처럼 뷰의 넓이 전체를 다 사용해버린다. 상대편의 말 풍선은 시작마진은 8dp, 끝마진을 30dp로 줬지만, 끝 마진이 먹지 않는다. android:layout_marginStart="8dp" android:layout_marginEnd="30dp" 해결하는 방법은 상대편의 말 풍선은 끝마진을 주지 말고, 대신 세로 가이드 라인을 만들어서 가이드라인에 30dp를 준다. 텍스트뷰에 있는 "android:layout_marginEnd="30dp"" 는 불필요하니 삭제하고 끝 위치 제약조건을 가이드로 준다. app:layout_constra..
OpenSubtitles.com에서 자막을 받아오는 소스를 만들고 있다. 자막을 받아왔는데, "1"이란 숫자만 보인다. 짐작에 자막이 srt포맷이라 맨처음 ID를 보여주는거 같다. 구글링 해보니 GsonConverterFactory를 쓰지 말고 ScalarsConverterFactory를 사용하라고 한다. A converter for strings and both primitives and their boxed types to text/plain bodies. 문자열이나 기본형을 텍스트형태 그대로 보여준다. interface OpenSubtitleDownloadService { @GET Call downloadFile(@Url String url); } public class OpenSubtitleApi..