RecyclerView ListView와 동일하게 데이터 세트를 개별 아이템으로 구성하여 화면에 출력하는 ViewGroup 중 하나다. 여러 데이터를 스크롤할 수 있게 화면에 표시하는 위젯이다. ListView와 다른점 ListView는 리스트가 갱신될 때마다 아이템 뷰를 새로 구성해야 한다는 단점이 있다. 반면에 RecyclerView는 이름에서 알 수 있듯이 개별 아이템을 재활용한다. 항목이 스크롤되어 화면에서 벗어나더라도 개별 뷰들을 제거하지 않고, 스크롤된 새로운 아이템의 뷰를 재사용하기 때문에 성능이 개선된다. 필요한 클래스 1. RecyclerView 데이터 세트를 화면에 출력하는 ViewGroup 2. ViewHolder 리스트의 개별 아이템은 ViewHolder 객체로 정의된다. Recyc..
다이얼로그를 커스텀해서 사용하면, match_parent를 해도 화면에 꽉 차지 않는 경우가 있다. 커스텀 다이얼로그의 기본 width, height 값이 0이기 때문이다. 이 경우 setContentview() 호출 후에 아래의 코드를 호출하면 해결된다. dialog?.window?.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT) 다이얼로그의 전체 크기를 ViewGroup.LayoutParams.MATCH_PARENT로 바꾸어주는 코드다.
코틀린으로 안드로이드 프로젝트를 구현하던 도중 아래와 같은 오류가 발생했다. 나같은 경우에는 ViewModel.Factory 인터페이스를 구현한 부분에서 생긴 오류였다. Inheritance from an interface with '@JvmDefault' members is only allowed with -Xjvm-default option android { kotlinOptions { freeCompilerArgs = ['-Xjvm-default=compatibility'] } } 모듈 build.gradle의 android-kotlinOptions 안에 freeCompilerArgs 한줄을 넣어주면 해결된다! 서치해봐도 잘 나오질 않아서 멘탈 터질뻔 했다.. 참고 https://stackoverf..
뷰 바인딩 xml에 있는 뷰들을 코드 상에서 바로 가져올 수 있는 기능이다. 코드가 지저분해질 수 있는 큰 원인인 findViewById()를 제거할 수 있다. 또한 findViewById()를 사용하면 관리해야 할 변수가 많아지고, 다른 액티비티의 xml을 가져오면 null값이 대입되어 NullPointerException이 발생할 위험이 있다. 뷰 바인딩을 사용하면 이러한 단점이 해결된다! 변수를 생성할 필요없이 xml의 id를 바로 사용할 수 있기 때문이다. 또한 다른 액티비티의 xml을 가져오면 컴파일 에러가 나기 때문에 비교적 안전하다. 그럼 뷰 바인딩을 적용하는 방법을 알아보자. 1. build.gradle (Module) android { ... viewBinding { enabled = t..
1. 기존에 있던 툴바를 사용하지 않기. 경로 -> /res/values/themes/themes.xml 2. res/menu/menu_toolbar.xml res 폴더 안에 menu 폴더 생성 후 menu_toolbar.xml 생성. (폴더명, 파일명 무관) 안에 자신이 툴바 안에 생성하고 싶은 항목들을 추가한다. id -> 다른 곳에서 항목을 참조할 때, 항목을 구분할 수 있는 아이디 (항목 이름) title -> 항목의 제목 icon -> 항목 아이콘. drawable 폴더 안에 아이콘을 넣어서 참조한다. app:showAsAction="always" : 항상 보이게 표시 app:showAsAction="ifRoom" : 액션바에 공간이 있을 경우에만 표시 3. toolbar layout 생성 (l..
앱 시작 상태 cold start 앱이 처음부터 시작. 앱의 프로세스를 만들지 않는다. 기기가 부팅되거나 시스템에서 앱이 종료되고 난 후 앱이 처음으로 시작되는 경우 등에서 발생한다. 다른 시작 상태보다 더 많은 작업을 실행해야 하므로 시작 시간이 길어질 수 있다. warm start 프로세스가 존재하지만 메모리에 올라오지 않은 경우. 사용자가 앱을 종료한 다음 다시 시작하거나, 시스템이 메모리에서 앱을 제거한 다음 사용자가 앱을 다시 시작하는 경우 등에서 발생한다. hot start 프로세스가 존재하고 메모리에 올라온 경우. 백그라운드에서 실행되고 있다가, 포그라운드로 올라온다. 스플래시 작동 방식 사용자가 스플래시를 직접 지정해주는 경우에는, 메모리에 이미 앱이 존재하는 hot start이어도 스플래..
내가 구현하려던 건 안드로이드에서 사용자에 대한 인공지능 모델을 생성하고, 그 결과값을 받아오는 것이었다 (안드로이드->web->파이썬) 당연히 어플을 실행하지 않아도, 백그라운드에서 인공지능 모델을 생성하고 학습시켜야 했기 때문에 백그라운드로 로직을 실행할 수 있는 Service 클래스로 구현했다 그런데 파이썬에서 모델을 학습시키기 위해서는 아주 많은 시간이 필요했고.. 안드로이드에서 파이썬의 응답을 기다리는 동안 ui가 멈춰 아무것도 하지 못했고, 응답시간이 넘으면 아예 ANR(Application Not Responding) 오류가 발생했다.. 구글링하다가 서비스는 응답시간이 10초가 넘으면 ANR오류가 발생한다는 걸 봤고, 백그라운드에서 ui의 제한없이 실행할 수 있는 클래스들을 찾아봤다 그리고 ..
MainActivity 클래스 안에 BluetoothDataReceiver라는 BroadcastReceiver 클래스를 넣었다고 할 때, 위와 같이 지정해주면 된다. 보통 액션명은 com.example.패키지명.액션설명 이렇게 많이들 쓴다. "RECEIVED_DATA"처럼 액션에 대한 설명만 간단히 적어도 문제는 없다. 서비스 클래스의 변수가 변경될 때, MainActivity UI를 바꾸는 브로드캐스트를 바꾸려고 했다. 그런데 MainActivity 클래스 내에서만 액티비티의 ui를 변경할 수 있으므로(setText 등) 액티비티 안에 브로드캐스트의 클래스를 집어넣었다. (동적으로 브로드캐스트를 선언해도 되지만, 그럴 경우 액션을 발생시키는 클래스가 다른 클래스라면 LocalBroadcastManage..