코틀린(Kotlin)/TIL 38

[코틀린(Kotlin)] getParcelableExtra() 실선, 버전 별 다르게 적용

[Github 레포지토리] Parcelable 객체를 전달받을 때 getParcelableExtra(name)을 쓴다고 해서 썼는데, 실선이 떴다 → 이게 API 33부터는 getParcelable(name, 캐스팅하려는 클래스)로 쓰게 바뀌었다고 한다 그리고 현재 이 프로젝트의 minSdk는 31이고, compileSdk는 34이므로 버전에 따라서 나누어 주도록 했다 버전에 따라서 나눠준 모습 버전에 따라 나눠서 적용한 건 좋았는데 중복되는 코드들이 보기 불편해서 효율을 위해 줄여보도록 했다 데이터를 받는 건 onCreate에서, 버전에 따른 작업은 따로 겹치는 코드들을 onCreate부분에서 받고 with를 사용해서 binding의 중복사용을 제거했다

[코틀린(Kotlin)] Parcelize와 사용법

[GitHub 레포지토리] 이번 프로젝트에서 Parcelize라는 것을 사용해 봤다 Parcelize란? 안드로이드의 IPC(Inter-Process Communication)를 위해 만들어진 인터페이스이다. IPC는 같은 시스템에서 실행되는 서로 다른 프로세스 간 데이터를 전송하는 메커니즘이다. 이 인터페이스를 사용하면 객체를 이동시키기 위한 방법인 *마샬링(또는 *직렬화)을 정의할 수 있게 된다. 그러나 마샬링 정의 과정이 복잡, 코드 길어짐 등의 문제가 있다. (= 가독성이 떨어지고 에러 발생 확률이 높다) @Parcelize는 코틀린에서 제공하는 *어노테이션으로 Parcelable 인터페이스 구현을 간소화한다. 컴파일러는 이 어노테이션이 붙은 클래스에 대해 자동으로 Parcelable 구현을 만들..

[코틀린(Kotlin)] Cannot format given Object as a Number

[GitHub 레포지토리] 상품가격에 1000 단위마다 콤마(,)를 주기 위해서 DecimalFormat을 추가해 줬다 근데, Cannot format given Object as a Number 에러가 뜨면서 앱이 다운되길래 무슨 내용인가 찾아봤더니 ItemPrice의 타입이 Int타입이 아닌 String타입이라 생기는 오류였다 이전에 상품의 1000 단위 콤마 적용을 ItemPrice타입을 String으로 주고 "1,000원" 이렇게 했었는데 DecimalFormat으로 바꿔준 후, Int타입으로 바꿔준 다음 1000을 적용시켜 줬다 결과

[코틀린(Kotlin)] 코틀린에서 버튼(Button) 색깔 바꾸기

xml에서 색깔을 바꾸려고 background에 @drawable/~~ 해줬는데 안 돼서 찾아봤다 res → values → themes.xml 에서 parent="Theme.AppCompat" 해주면 된다고 하길래 바꿔줬더니 위처럼, 백그라운드 지정을 안 해준(?) 뷰들은 전부 이런 식으로 나왔다 그래서 다시 theme.xml을 parent="Theme.Material13.DayNight.NoActionBar"로 되돌려놓고 더 검색해 봤더니 그냥 Button 뷰 대신 AppCompatButton 뷰를 사용하면 된다고 해서 바꿔줬다

[코틀린(Kotlin)] 뒤로가기(back) 버튼 클릭 시 다이얼로그 띄우기 onBackPressedCallback

개인과제 진행 중, 별도의 버튼을 누르지 않고 기기의 뒤로가기(back) 버튼 클릭 시 종료하겠습니까?라는 다이얼로그를 띄운 후 처리하도록 하는 기능이 있었다 onBackPressed()를 사용하면 된다고 하길래 열심히 다이얼로그를 만들었다 override fun onBackPressed() { // 다이얼로그 생성 val builder = AlertDialog.Builder(this@MainActivity) // 제목 builder.setTitle("종료") // 콘텐츠 영역 builder.setMessage("정말 종료하시겠습니까?") // 제목 옆의 아이콘 builder.setIcon(R.drawable.chat) val listener = object : DialogInterface.OnClick..

[코틀린(Kotlin)] 알림

알림 앱의 UI와 별도로 사용자에게 앱과 관련한 정보를 보여주는 기능 알림을 터치하여 해당 앱을 열 수 있다 - Android 7.0부터는 문자답하기 같은 간단한 작업을 할 수 있다 보통 단말기 상단 부분에 표시되고, Android 8.0부터는 앱 아이콘의 배지로도 표시된다 1. 알림 채널 (Android 8.0 이상) Android 8.0 이상의 경우에는 알림을 만들기 전에 알림 채널을 먼저 만들어야 한다 알림 채널은 알림을 그룹 하여 알림 활성화나 방식을 변경할 수 있다 현재 앱이 실행 중인 안드로이드 버전을 확인하여 8.0 이상인 경우에만 채널 생성한다 private val myNotificationID = 1 private val channelID = "default" private fun cre..

[코틀린(Kotlin)] 다이얼로그

다이얼로그 (Dialog) 사용자에게 결정을 내리거나 추가정보를 입력하라는 메시지를 표시하는 작은 창 다이얼로그는 화면을 가득 채우지 않으며 보통은 사용자가 다음으로 진행하기 전에 조치를 취해야 하는 모달 이벤트에 사용된다 1. 다이얼로그 구조 제목 - 콘텐츠 영역에 상세한 메시지, 목록 또는 맞춤 레이아웃이 채워져 있는 경우에 사용한다 - 단순 메시지 또는 질문을 나타내는 경우에는 없어도 된다 콘텐츠 영역 - 메시지, 목록 또는 다른 맞춤 레이아웃을 표시할 수 있다 작업 버튼 - 대화 상자 하나에 작업 버튼이 세 개를 초과하면 안 된다 2. 다이얼로그의 만들어보기 우선 뷰바인딩 추가부터.. + activity_main.xml에 만들어 볼 다이얼로그들을 띄울 버튼 생성 activity_main.xml 더..

[코틀린(Kotlin)] 프래그먼트 데이터 전달

액티비티 → 프래그먼트 데이터 전달 프래그먼트 → 프래그먼트 데이터 전달 프래그먼트 → 액티비티 데이터 전달 1. 액티비티에서 프래그먼트로 데이터를 전달하는 경우 MainActivity.kt (데이터를 보내는 액티비티) 더보기 package com.android.ex_view2 import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.widget.Toast import androidx.fragment.app.Fragment import androidx.fragment.app.commit import com.android.ex_view2.databinding.ActivityMainBinding class M..

[코틀린(Kotlin)] 프래그먼트 (Fragment)

프래그먼트 (Fragment) 액티비티 위에서 동작하는 모듈화 된 사용자 인터페이스 액티비티와 분리되어 독립적으로 동작할 수 없다 여러 개의 프래그먼트를 하나의 액티비티에 조합하여 창이 여러 개인 UI를 구축할 수 있다 하나의 프래그먼트를 여러 액티비티에서 재사용할 수 있다 1. 액티비티와 프래그먼트 비교 액티비티 - 시스템의 액티비티 매니저에서 인텐트를 해석해 액티비티 간의 데이터를 전달 프래그먼트 - 액티비티의 프래그먼트 매니저에서 메서드로 프래그먼트 간의 데이터를 전달 2. 프래그먼트를 사용하는 이유? Activity로 화면을 넘기는 것보다 Fragment로 일부만 바꾸는 것이 자원 이용량이 적어 속도가 빠르기 때문 3. 프래그먼트를 정의하기 3-1. 안드로이드스튜디오에서 File → New → F..

[코틀린(Kotlin)] 리사이클러 뷰 (RecyclerView)

리사이클러 뷰 (RecyclerView) 안드로이드 앱에서 리스트 형태의 데이터를 표시하는 데 사용되는 위젯 여러 아이템을 스크롤 가능한 리스트로 표현하며, 많은 아이템을 효율적으로 관리하고 보여주는 역할을 한다 한정적인 화면에 많은 데이터를 넣을 수 있는 View View를 재활용(Recycle) 해서 사용 리스트 뷰(ListView)와 리사이클러 뷰(RecyclerView) 리스트 뷰 (ListView) - 사용자가 스크롤할 때마다 위에 있던 아이템은 삭제되고, 맨 아래의 아이템은 생성되길 반복한다 - 아이템이 100개면 100이 삭제, 생성을 반복하므로 성능에 좋지 않다 리사이클러 뷰 (RecyclerView) - 사용자가 스크롤할 때, 위에 있던 아이템은 재활용돼서 아래로 이동하여 재사용한다 - ..