일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 안드로이이드 submodule
- Kotlin
- firebase
- 앱
- 카페오냥
- 코틀린
- 앱개발
- 내 맘대로 정리한 안드로이드
- github
- 서브모듈 pull
- 쿼터뷰
- java
- 유니티
- 2d게임
- gitlab submodule
- Android Studio
- 티스토리
- GIT
- Unity
- 안드로이드
- DataBinding
- submodule sourcetree
- 안드로이드개발
- github submodule
- 목서버
- 타이쿤
- 개발
- 게임개발
- Android
- 서브모듈 sourcetree
- Today
- Total
목록전체 글 (80)
Uing? Uing!!
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/8Q31S/btrigIPdMdS/atO7NybCNnOE1wKLpxDZ90/img.png)
기본적으로, 하나의 패키지명은 하나의 고유한 앱을 의미한다. 그리고, 같은 패키지명을 가진 앱은 같은 기기에 설치될 수 없다. 그러므로, 같은 앱은 기기에 두 개 이상 설치할 수 없다. 하지만 같은 종류의 앱을 여러 타입, 또는 여러 버전으로 나누어 빌드하고 싶을 수도 있다. 아래 두 상황을 대표적인 예로 들 수 있다. (공식 문서에서도 이 두 가지를 예로 들어 설명한다.) 1) 출시용과 디버그용 앱을 분리하기 위해서 - 이 경우 디버그용 앱에는 몇 가지 기능들이 추가될 것이다. 2) 무료앱과 유료앱을 분리하기 위해서 - 이 경우 무료앱에서는 유료앱의 기능들이 잠김 상태로 표시될 것이다. 이런 경우에 사용할 수 있는 것이 Build Varients(빌드 변형)이다. Build Varients(빌드 변형)..
발단 DrawerLayout을 처음 사용하면서 했던 아주 가벼운 삽질이다. (이 다음 포스팅으로 DrawerLayout에 대해 작성할 듯) 작업 중이던 레이아웃에는 EditText가 있었고, 좌측 메뉴를 누르면 이 EditText를 가리는 DrawerLayout이 나타나게 되어 있었다. 그런데, 좌측의 메뉴를 누른 후에는 EditText가 보이지 않음에도 불구하고, DrawableLayout의 빈 공간(EditText가 숨겨져 있는 공간)을 클릭하니 키보드가 올라온 것이다. 삽질 처음에는 내가 레이아웃의 해당 위치에 다른 버튼 동작을 달아 놓은 줄 알고 코드를 찾아 보았지만 그런 코드는 없었다. 결국 이 스택오버플로 답변을 보고, '앗... 알고 있던 거였는데...' 하며 수정했다. 삽질일기를 열심히 써..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bpyej5/btraJpiOhBP/KLNk0XlRIQR4oWSxM91OIk/img.png)
안드로이드에서 화면을 그리다 보면 그림자가 있는 뷰를 만들어야 하는 일이 많다. 이런 식으로 배경에 그림자를 주기 위해서는 아예 배경 이미지 또는 drawable이 그림자를 갖도록 만들어버리는 방법이 있다. 하지만 elevation을 사용하면 따로 그림자가 포함된 리소스를 만들지 않고도 이렇게 그림자를 줄 수 있다. Elevation Elevation은 xml layout에서 뷰에 줄 수 있는 속성으로, API21부터 추가되었다. 레이아웃에서 그림자를 주고자 하는 뷰에 단순히 elevation을 dp값으로 집어넣어 주는 것만으로 그림자 표현이 가능하다. 아래 코드는 위에 첨부된 사진에 해당하는 레이아웃이다. Elevation 속성으로 넣어주는 dp값은 뷰의 z축, 즉 '높이'에 해당한다. 따라서 5dp,..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/W7x10/btraKF0uioI/4652cU3Y9DTZW5eRE8HR9K/img.png)
웹뷰와 디버깅 오늘은 회사에서 새로 알게 된 크롬의 디벨로퍼 기능을 정리해둘 겸 블로깅하려 한다. 웹뷰를 가지고 작업을 하다 보면, 디버깅이 쉽지 않다. 웹개발이라면 일반 크롬 창에서 개발자 툴로 디버깅을 할 수 있을 것이고, 안드로이드 네이티브 화면이라면 ide의 디버깅 툴을 사용하거나 로깅할 수 있겠지만, 웹뷰는 안드로이드 에뮬레이터에서 돌아가면서도 내용을 직접 확인하거나 건드리기가 어렵다. Chrome DevTools 하지만 Chrome DevTools의 기능을 사용하면 연결된 디바이스의 웹뷰를 마치 PC 크롬 브라우저에서 관찰하듯 관찰할 수 있다. 기능의 사용 방법 또한 무척 간단하다. 이 기능을 사용하기 위해서는, 1. 우선 웹뷰에서 디버깅을 활성화시킨다 WebView.setWebContents..
처음 안드로이드를 접하면, 화면에서 원하는 뷰에 접근하기 위해 findViewById 메소드를 사용하게 된다. 아, 요즘은 기초를 배울 때 코틀린 extensions를 사용하는 방식이 더 보편적일지도 모르겠다. 코틀린 익스텐션의 방식 역시 각 뷰에 캐싱을 걸어서 반복작업을 조금 줄여줄 뿐, 내부적으로는 이 findViewById 메소드를 사용하고 있다. 코틀린 extensions에 대해서도 이야기할 부분이 많지만, 우선은 findViewById 메소드를 들여다보고자 한다. findViewById의 동작 방식 기본적으로 findViewById 메소드는 id값을 이용해 특정 뷰를 받아와주는 메소드로, 액티비티, 프래그먼트, 뷰홀더 등에서 다양하게 사용이 되곤 했다. 이 메소드를 이용해 텍스트뷰를 가져와 데이..
발단 액티비티 내에 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 개요를 보면 이런 설..
View.setOnClickListener 안드로이드의 View.setOnClickListener는 아래처럼 OnClickListener라는 인터페이스를 받도록 설계되어 있다. public void setOnClickListener(@Nullable OnClickListener l) { if (!isClickable()) { setClickable(true); } getListenerInfo().mOnClickListener = l; } 이 구조에 정확하게 맞추어서 코틀린 코드를 작성한다면 이렇게 될 것이다. button.setOnClickListener(object: View.OnClickListener { override fun onClick(v: View?) { println("Clicked!") ..