본문 바로가기

안드로이드

(63)
java.lang.NoSuchMethodError: No virtual method elapsedNow()D in class Lkotlin/time/TimeMark 1. 발생 원인 Koin을 사용할 때, androidLogger에 아무것도 설정해주지 않으면 위 에러가 발생합니다. 그 예시로 다음과 같이 사용하시면 에러가 발생합니다. startKoin { androidLogger() androidContext(this@ApplicationClass) modules(beerSpecificModule, beerSpecificVMModule, recommendBeerModule, recommendBeerVMModule, feedbackModule, feedbackVMModule, refrigeratorModule, refrigeratorVMModule, userInfoModule, userInfoVMModule, writeAndReviseReviewModule, write..
툴바(Toolbar) 내부 텍스트뷰(TextView) 문자열 가운데로 배치하는 법 안녕하세요? 닉네임간편입니다. 이번 시간에는 툴바 내부에 텍스트뷰의 문자열을 가운데로 배치하는 법에 대해서 설명드리겠습니다. 1. 문제 툴바에 문자열을 배치할 때 기본 title을 사용하지 않고 텍스트뷰를 사용하는 경우가 있습니다. 그런데 문자열을 가운데에 배치하려고 layout_gravity 속성을 설정하여도 가운데에 배치가 되지 않는 경우가 있습니다. 2. 해결 방법 이때 contentInsetStart 또는 contentInsetLeft을 0dp로 설정하면 중앙에 가깝게 배치할 수 있습니다. 툴바 내부에선 Navigation 버튼이나 메뉴 아이템들이 배치될 수 있고, 이것들이 기본적으로 차지할 만한 최소한의 공간을 미리 설정합니다. 이 값은 default로 16dp이며, 따라서 기본적으로 툴바 내부..
Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 1 path $ 1. 발생 원인 JSON 포멧 데이터를 GSON 라이브러리를 통해 사용할 때 발생할 수 있는 오류입니다. 2. 해결 방법 retrofit 객체를 만들 때 gson 객체에 속성을 추가해서 설정해주면 됩니다. 먼저 아래처럼 retrofit 객체를 만들어줍니다. sRetrofit = Retrofit.Builder() .baseUrl(API_URL) .client(client) .addConverterFactory(GsonConverterFactory.create()) .build() 이때 GsonConvertFactory.create() 부분에 gson 객체를 만들어서 넣어주면 됩니다. gson 객체는 다음과 같이 만들어줍니다. val gson : Gson = GsonBuilder() .setLenient()..
could not find Fragment constructor 안녕하세요? 닉네임간편입니다. 이번 시간에는 제목에 있는 오류에 대해서 설명드리겠습니다. 1. 개요 이 에러는 RuntimeException 중 하나로, 프래그먼트를 만들 때 인자를 넣어서 만들었기 때문에 발생합니다. 왜냐하면 프래그먼트를 재생성할 때 빈 생성자가 있어야 하기 때문입니다. 따라서 인자를 넣어주고 싶다면 프래그먼트 자체를 만들 때 인자를 넣지 말고, 두 가지 방법을 사용할 수 있습니다. 1) FragmentFactory 이용 이 방법을 이용하면 프래그먼트에 인자를 넣어서 만들어줄 수 있습니다. 그러나 현재 이 방법을 이용하면 동일한 이름의 프래그먼트에 대해서는 다른 값을 줄 수 없기 때문에(제가 방법을 아직 못 찾은 걸수도 있지만) 사용하지 않았습니다. 2) arguments 이용 argu..
Missing required view with ID 1. 발생 원인 커스텀 뷰를 만들어서 사용할 때, 해당 커스텀 뷰를 다른 곳에서 사용할 때 바로 id를 사용하면 이 에러가 발생합니다. 즉, 예를 들어서 아래처럼 사용할 경우 위 에러가 발생합니다. 2. 해결 방법 커스텀 뷰는 다른 레이아웃 안에 포함시키고, 그 레이아웃에 ID 값을 할당해서 사용해야 합니다. 한 가지 예시로, 아래처럼 LinearLayout 으로 커스텀 뷰를 감싼 다음 사용하시면 됩니다.
SharedPreferences 개념 및 사용법 1. 정의 간단한 데이터의 저장을 목적으로 사용합니다. SharedPreferences는 내부 저장소를 이용하기 때문에 권한 설정이 필요 없고 간단한 코드로 사용할 수 있습니다. (이때 꼭 뒤에 s를 붙여야 합니다. SharedPreference's') 주로 로그인 정보나 앱의 상태 정보를 저장하는 용도로 사용되며, 액티비티에서 인텐트에 값을 넣고 빼는 것과 비슷한 형태로 동작합니다. 2. 사용법 1) Editor로 데이터 저장하기 fun setSharedData(name: String, key: String, data: Int) { var pref: SharedPreferences = getSharedPreferences(name, Activity.MODE_PRIVATE) var editor: Shar..
Koin을 통해 의존성 주입하기 0. 의존성 주입에 대해서 1) 의존성(Dependency)이란? 현재 객체가 다른 객체와 상호작용을 하고 있다면 현재 객체는 다른 객체에 의존성을 가진다고 합니다. 의존성이 높은 경우, 하나의 모듈이 바뀌면 의존하고 있던 다른 모듈까지 변경되어야 합니다. 또한 두 객체 사이에 의존성이 존재한다면 단위 테스트를 하기 어려워집니다. 따라서 이를 해결하기 위해 의존성 주입 개념을 도입할 수 있습니다. 2) 의존성 주입(Dependency Injection)이란? 내부에서 객체를 생성하는 것이 아니라, 외부에서 객체를 생성하여 의존성을 주입해주는 것입니다. a. 장점 코드의 재사용성을 향상시키고, 더 간결하게 코드를 작성할 수 있습니다. 또한 객체의 생성과 사용을 분리시켜 종속된 코드를 줄여줍니다. 이를 통해..
ListView와 RecyclerView의 차이점 안녕하세요? 닉네임간편입니다. 앱을 개발하면서 화면에 아이템을 나열하여 보여야 할 때가 많은데요, 그럴 때 유용하게 사용하는 것이 바로 리스트뷰(ListView)와 리싸이클러뷰(RecyclerView)입니다. 둘의 기능이 유사하다 보니 한 요소만 사용하거나 혹은 두 요소를 혼동해서 사용하는 경우도 있었는데요, 이번 시간에는 이 둘의 차이점에 대해서 자세히 다루어보겠습니다. 1. 책임(Responsibility) 여기서 '책임'이라는 말은 어떤 기능을 구현함에 있어서 주요한 역할을 한다는 것을 의미합니다. 리스트뷰는 해당 클래스 내부에서 자체적으로 많은 것들을 설정할 수 있습니다. 따라서 리스트뷰는 해당 클래스가 모든 '책임'을 갖고 있다고 볼 수 있습니다. 반대로 리싸이클러뷰는 해당 클래스 자체에서 많은..

728x90
반응형