코틀린(Kotlin) 91

[코틀린(Kotlin)] RecyclerView - StickyHeader, 스크롤 시 상단 뷰 고정

라이브러리를 사용하지 않고 외부 코드를 인용해 StickyHeader를 사용하기 ItemDecoration RecyclerView의 커스텀 기능 ex) 아이템 간의 구분선을 만들기, 스크롤 이동 시 상단에 특정 뷰 고정 등 [GitHub 레포지토리] ItemDecoration 코드와 사용한 코드 HeaderItemDecoration.kt 더보기 package com.android.basic_recyclerview import android.graphics.Canvas import android.graphics.Rect import android.view.MotionEvent import android.view.View import android.view.ViewGroup import androidx.re..

[코틀린(Kotlin)] RecyclerView에 Divider 구분선 넣기, DividerItemDecoration

[GitHub 레포지토리] 프로젝트 중 RecyclerView 아이템들 사이에 구분선을 그리는 기능이 필요했다. 그런데, RecyclerView는 ListView와 다르게 자체적으로 구분선을 그리는 기능이 없고, ItemDecoration을 사용해야 한다고 한다. 혹은 xml에서 를 이용해서 구분선을 주기도 한다. 그런데, 를 이용한 방법은 퍼포먼스에 영향을 주고, 좌우 슬라이드시 하단 구분선이 같이 움직이며, 각각 구분선을 통제할 수 없어지는 문제가 생긴다고 한다 그래서 ItemDecoration을 이용해서 구분선을 추가해 줬다 // 리사이클러 뷰 아이템들 사이에 구분선 추가 val decoration = DividerItemDecoration(applicationContext, VERTICAL) bi..

[코틀린(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..