본문 바로가기

Android

(57)
onNewIntent 개념 및 사용법 1. 개요 startActivity() 나 startActivityForResult() 메서드를 호출하면 액티비티 화면을 띄울 수 있습니다. 그런데 동일한 액티비티를 계속 위의 메서드로 호출하게 되면 동일한 액티비티가 메모리에 여러 개 만들어질 것입니다. 이를 방지하기 위해서 Flag(플래그)를 사용할 수 있습니다. 플래그를 사용하면 동일한 액티비티가 계속해서 생성되지 않고 하나의 액티비티만 존재하게 할 수 있습니다. 2. 생명주기 다른 액티비티에서 이미 생성된 액티비티를 호출하면 onNewIntent() → onResume() 메서드 순서로 호출됩니다. 그런데 만일 동일한 액티비티에서 동일한 액티비티를 호출하면 onPause() → onNewIntent() → onResume() 메서드 순서로 호출됩니..
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 으로 커스텀 뷰를 감싼 다음 사용하시면 됩니다.
Expected BEGIN_OBJECT but was STRING at line 1 column 1 1. 발생 원인 retrofit을 사용해서 데이터를 전달받을 때, response로 설정한 값과 들어온 값의 자료형이 다를 때 생기는 오류입니다. 예를 들어 제가 response에 해당하는 데이터 클래스를 다음과 같이 했다고 가정하겠습니다. data class RefrigeratorResult( val beerImgUrl: BeerImage, val nameKr: String, val beerId: Int ) 그런데 데이터가 실제로는 이런 형식으로 전달된다고 하겠습니다. data class RealRefrigeratorResult( val beerImgUrl: String, val nameKr: String, val beerId: Int ) 이때 저는 beerImgUrl 이라는 변수를 BeerImage라..
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..

728x90
반응형