일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
- Unity
- submodule sourcetree
- 코틀린
- firebase
- DataBinding
- 2d게임
- 안드로이드
- 앱개발
- 목서버
- Kotlin
- Android Studio
- GIT
- java
- 카페오냥
- 안드로이이드 submodule
- 유니티
- 안드로이드개발
- 쿼터뷰
- 앱
- 개발
- Android
- 서브모듈 sourcetree
- github
- github submodule
- 내 맘대로 정리한 안드로이드
- 티스토리
- gitlab submodule
- 서브모듈 pull
- 타이쿤
- 게임개발
- Today
- Total
목록Android (45)
Uing? Uing!!
발단 액티비티 내에 RecyclerView가 있었고, 스크롤 관련된 로직이 많았다. 그런데 특정 상황에서 이 글의 제목과 같이, java.lang.IllegalStateException: Cannot call this method while RecyclerView is computing a layout or scrolling androidx.recyclerview.widget.RecyclerView 라는 크래시로그가 나는 것을 발견했다. OMG. 해당 크래시가 발생하는 위치는 notifyItemInserted였다. 삽질 스택트레이스 메시지를 보고 당연히 스크롤과 관련된 문제일거라고 생각했다. 구글링을 해 보아도 stackOverflow에서는 notifyItem~ 메소드가 스크롤 이후에 실행될 수 있도록 ..
MVVM 구조를 사용한다면 흔히 뷰모델에서 LiveData를 사용하여 데이터나 이벤트를 변경하고, 액티비티 등의 onCreate 부에서 이 LiveData에 Observer를 달아 데이터가 변경되었을 때 화면에 반영하곤 한다. 그렇다면 이렇게 설계했을 때에는 항상, Q. LiveData로 들어가는 모든 값들이 observe될 수 있을까? 결론만 말하자면, NO이다. 두 가지 이유가 있는데 하나는 1) observer의 상태, 다른 하나는 2) postValue의 동작 방식과 관련이 있다. 1) Observer가 Active하지 않은 경우 기본적으로 LiveData는 액티비티, 프래그먼트 등의 수명주기와 긴밀하게 연결되어 작동한다. 특히 안드로이드 Developers의 LiveData 개요를 보면 이런 설..

Lint 안드로이드 프로젝트를 작업하다 보면 IDE가 시각적으로 수정을 요청하는 코드들이 있다. 그중에는 빌드 자체가 안 되는 코드도 있고, 빌드는 되지만 수정이 권장되는 코드도 있다. 바로 조금 전에 포스팅했듯이, @CallSuper 어노테이션이 있는 메소드를 상속받았는데 super의 메소드를 호출하지 않는다면 컴파일 에러가 발생한다. 이때 코드 상에서도 빨간색으로 밑줄이 표시된다. 정상적으로 빌드가 되는 코드들에도 자주 수정 요청 표시가 나타난다. ImageView가 contentDescription을 적어 달라고 글씨 밑에 노란색 배경이 띄워지거나, 어떤 변수가 실제로 사용되고 잇지 않다고 회색 글씨로 표시되거나, if문의 return을 앞으로 빼 달라고 밑줄을 긋는다거나... 이 외에도 다양한 경..
dp, sp, px 안드로이드에서 폰트 크기를 설정할 때 나는 일반적으로 sp를 사용한다. 다만 실제 디자인에서는 상황에 따라 sp가 아닌 dp, 심지어 px를 사용하는 경우도 있다. 안드로이드 개발자 문서에서는 dp와 sp, px에 대해 이렇게 설명한다. dp (밀도 독립형 픽셀) - 화면의 물리적인 밀도에 기반한 추상적인 단위입니다. 이 단위는 160dpi(인치당 도트 수) 화면에 상대적이며 화면에서 1dp는 대략 1px와 같습니다. 더 높은 밀도의 화면에서 실행한다면 1dp를 그리는 데 사용되는 픽셀의 수는 화면의 dpi에 적절한 배율로 확장됩니다. 마찬가지로 더 낮은 밀도 화면에서 실행한다면 1dp에 사용되는 픽셀 수는 축소됩니다. dp 대 픽셀의 비율은 화면 밀도에 따라 달라지지만, 반드시 정비..
사건의 발단 프로젝트 내에 구현할 인터페이스가 있었고, 이 인터페이스에 맞추어 구현한 객체가 있었다. 분명히 인터페이스에서 요구하는 모든 메소드를 다 구현한 상황이었다. 그런데 잘만 작동하던 코드가 갑자기 메소드가 구현되지 않았다며 java.lang.AbstractMethodError를 뽑아내는 것이다! 삽질의 과정 다시 확인해 봐도 메소드는 다 구현되어 있었다. 가장 최근에 수정한 코드가 무엇인가 생각해 보니, 이 메소드의 파라미터들을 수정했었다. 뭔가 파라미터의 내용과 순서를 바꾸는 과정에서 이전 빌드 내용과 충돌이 일어난 게 아닐까 싶었다. 삽질의 결과 나름대로 헤맨 것 치고는 해결법은 단순했다. 안드로이드 스튜디오에서 clean build -> rebuild를 하였더니 바로 해결되었다. 결론이 너..
WebView 모바일 웹은 javascript를 기반으로 동작한다. 웹뷰는 이런 모바일웹을 안드로이드 앱 내에서 보여주는 View이다. 기본적으로 html, css, js를 기반으로 만들어져 있는 만큼, 안드로이드 네이티브 코드에서는 수정할 수 있는 부분이 거의 없다. 단지 웹뷰 내에서의 몇몇 이벤트를 인식하고 반응하는 정도의 활용이 가능하다. WebView의 close 이벤트를 인식하지 못하는 경우 웹뷰에서는 분명히 window.close()가 호출되고 있는데, 안드로이드 화면에서 웹뷰가 닫히지 않는 경우가 있다. 웹뷰 안에서 다른 창을 여는 경우에 이런 상황이 발생하게 된다. 이를 해결하기 위해서는 아래처럼 웹뷰에 webChromeClient를 달아 주고, onCloseWindow를 오버라이딩하여 화..
dp to px 안드로이드에서 크기를 다루다 보면 Dp(Density-Independent Pixel)에서 px(pixel)로 변환해 사용해야 하는 경우가 있다. dp에서 px로 변화하는 방법으로는 두 가지가 있다. 1. 전역 함수 정의하기 아래와 같은 dp2px 함수를 UIUtil 등의 object 안에 정의하거나, 또는 그냥 전역 함수로 정의하여 사용할 수 있다. fun dp2px(dp: Float, context: Context) = TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP, dp, context.resources.displayMetrics) val px = dp2px(dp, context) 2. Resources.getDimensionPix..
리소스 안드로이드에서는 string, integer, dimen, color, style 등 여러가지 값들을 Resource 내의 파일에 이렇게 지정해두고, 샘플 스트링 아래처럼 가져와서 사용할 수 있다. val animalName = resources.getString(R.string.sample_string) 리소스의 id를 동적으로 받아와야 하는 경우 리소스 아이디가 위의 예시처럼 sample_string과 같은 깔끔한 이름이라면 문제가 없지만, 이런 상황을 가정해 보자. 어플리케이션에 사용되는 100 종류의 동물이 있는데, 각 동물의 명칭은 strings.xml 파일에 animal_{동물id}라는 name으로 추가되어 있다. 그렇다면 strings.xml 파일에는 값들이 이런 방식으로 지정되어 있..