Programming(199)
-
Oreo 이상의 OS에서 Notification이 발생하지 않는 문제
>Developer warning for package "com.your.app" Failed to post notification on channel "null" See log for more details Notification이 발생하지 않아서 원인을 추적하던 중, Notification이 발생해야 할 시점에 Logcat을 확인하니 위와같은 에러가 찍혔다. 테스트용 스마트폰을 LG G5, Samsung Galaxy FE, Samsung Galaxy 7을 구비해놓고 테스트했는데, Samsung폰에서만 증상이 발생해서 제조사에 따른 문제인가 싶었다. 확인해보니 Android 8.0 부터 추가된, notification channels과 관련된 내용이었다. LG G5에서 증상이 발생하지 않은 건, 단순히..
2019.02.14 -
RecyclerView와 IndexOutOfBoundsException
기존에 릴리즈된 Android App을 유지보수하면서, RecyclerView에 아이템을 추가하는 코드가 때때로 IndexOutOfBoundsException로 인해 App Crash가 발생하는 경우가 발생했다. Android 자체를 너무 오랜만에 보다보니, RecyclerView에 대한 것부터 알아봐야했다. 자세한 내용을 정리하기엔 시간이 부족한데다가, 잘 정리된 글들이 많아서 이하의 링크로 대체한다. RecyclerView, Android Developers Android RecyclerView 사용하기, Taehwan 님 RecyclerView에 대한 고찰, Dudmy 님 스크롤이 발생했을 때 스크롤의 위치가 마지막일 경우 다음 검색결과를 불러온 뒤, notifyItemRangeChanged(int..
2019.02.14 -
[IntelliJ] 검색과 관련된 단축키 정리
편집기를 이용해서 코드를 편집하다보면, 동일한 내용을 찾아서 일괄적으로 변경하고자 할 때가 있다. Replace all을 통해서 한번에 대체할 수도 있지만, 개인적으로는 검색한 내용과 일치하는 내용을 Multi-cursor로 선택한 후, 직접 수정하는 편을 더 좋아하는 편이다. Visual Studio Code나 Atom에서는 `Ctrl+D`를 통해서 선택할 수 있던 내용이다. IntelliJ에서는 `Alt+J`를 사용해서 동일한 기능을 수행할 수 있다. 함수 내에서 `multi_cursor_a`, `multi_cursor_b`라는 변수를 선언하여 사용하다가, 이를 낙타표기법(`multiCursorA`, `multiCursorB`)으로 변경하고자 한다면, `multi_cursor_`를 선택한 후 `Alt..
2019.02.14 -
WebView와 WebSettings
WebView를 사용하면 웹 페이지를 Android의 레이아웃에 표시하는 것이 가능하다. 다만 설정을 변경해주지 않으면 Javascript를 사용하지 못하는 등, 여러가지 제약사항이 발생한다. 아래의 코드를 참조하자. WebView webView = (WebView)findViewById(R.id.id_webview); webView.setWebViewClient(new WebViewClient()); webView.loadUrl("https://www.google.com"); layout의 id_webview를 불러온 후, 구글 검색페이지을 로드한다. 이 코드를 실행하면 구글 페이지가 WebView에 로드되는 것을 확인할 수 있다. 하지만 기본적으로 WebView는 Javascript를 실행하지 않도록..
2019.02.12 -
Backing Field와 Backing Properties
필사를 하던 중에 잘 이해가 가지 않는 개념이 있어서 내용을 정리한다. 구글링을 해봤지만 잘 번역된 검색을 발견하지 못해서, 어설프나마 검색을 통해 이해한 내용을 취합하여 정리한 내용이다. Backing Field Kotlin의 Bakcing Field는 getter/setter에 기본적으로 생성되는 속성(property)이다. Kotlin에서는 Class내의 property에 값을 할당할때는 내부적으로 setter가, 값을 불러올때는 getter가 호출된다. 다음의 코드를 참조하도록 하자. class User{ var name: String get() = name set(value) {name = value} } 위의 코드에서 User.name에 “BlackBear”라는 값을 할당하게되면, User.n..
2019.02.12 -
loop에서 findViewById 사용하기 (getIdentifier)
getIdentifier(), Android Developers public int getIdentifier (String name, String defType, String defPackage) 주어진 리소스의 이름을 통해, 리소스의 식별자(id)를 반환한다. package:type/entry 형식으로 완전히 정규화된 이름(fully qualified resource name)을 사용할 수 있다. 완전히 정규화된 이름을 사용할 때는 defType과 defPackage를 생략할 수 있다. 여러개의 리소스가 규칙적인 이름을 가지고 있을 때 사용한다. Button button1 = (Button) findViewById(R.id.button1); Button button2 = (Button) findView..
2019.02.11