Android/공부 (23) 썸네일형 리스트형 ViewModel에 대해서 알아보자 1. ViewModel이 나오게 된 배경 ViewModel은 UI 관련 데이터를 저장하고 관리해주는 역할을 합니다. 앱을 만들 때 화면을 세로에서 가로로 회전하면 화면에 있던 데이터가 날라가는 경우가 있습니다. 화면이 전환될 때는 단지 방향만 바뀌는 것이 아니라 액티비티가 destroy 되었다가 다시 create 되는데, 이때 데이터가 날라가기 때문입니다. 이때 데이터를 보존하기 위해 savedInstanceState를 사용할 수 있습니다. 그러나 구글에서는 여기에 50k 미만의 데이터만 담도록 권장하고 있으며, 담을 수 있는 데이터의 형태도 제한되어 있습니다. 또한 onCreate() 메서드에서 작업을 처리해야 하기 때문에 UI 컨트롤러가 해야 할 일이 늘어나면서 화면을 띄우는 데 시간이 오래 걸립니다.. 커스텀 보틈시트(BottomSheet) 만들기 1. 레이아웃 파일 만들기 자유롭게 작성해주시면 됩니다. 저는 아래처럼 작성했습니다. 2. 클래스 생성 BottomSheetDialogFragment를 상속한 클래스를 생성해야 합니다. 저는 아래처럼 작성했습니다. class FirstStickerBottomSheet(val itemClick: (Int) -> Unit) : BottomSheetDialogFragment() { lateinit var firstOkay : AppCompatButton lateinit var firstCancel : AppCompatButton override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle.. 커스텀 스낵바, 커스텀 토스트 만들기 1. 커스텀 스낵바 만들기 private fun showSnackBar(view: View, message: String, action: String?, clickListener : View.OnClickListener?) { val snackbar = Snackbar.make(view, message, Snackbar.LENGTH_LONG) .setTextColor( ColorStateList.valueOf( ContextCompat.getColor(this, R.color.white))) .setActionTextColor(ColorStateList.valueOf( ContextCompat.getColor(this, R.color.mackduck_yellow))) snackbar.setBackgrou.. 안드로이드 스크린샷 감지 1. 개요 커스텀 갤러리를 만드는 경우, 스크린샷이 발생하면 해당 사진 또한 실시간으로 갤러리에 추가해야 할 수 있습니다. 저도 그렇게 구현했구요. 또는 스크린샷이 발생했을 때 특정 동작을 하도록 앱을 구현하고 싶은 경우도 있습니다. 지금부터 스크린샷을 감지하는 방법에 대해 순서대로 설명드리겠습니다. 2. 스크린샷 이벤트 감지 우선 전체 코드는 다음과 같습니다. val handler = Handler(Looper.getMainLooper()) contentObserver = object : ContentObserver(handler) { override fun onChange(selfChange: Boolean, uri: Uri?) { val regex = Regex(MediaStore.Images.Me.. 에디트텍스트(EditText) 관련 짜투리 지식 1 (실시간으로 쉼표 표시하기, 커서 커스텀, 동그란 커서 색상 변경) 1. 실시간으로 숫자에 쉼표 표시하기 화폐 단위를 입력할 경우 쉼표를 사용하면 좀 더 보기 편하게 만들 수 있습니다. 이 경우 먼저 NumberFormat 를 사용하면 됩니다. val price = binding.editText.text.toString().toInt() val formatter = DecimalFormat("#,###") as NumberFormat val priceText = formatter.format(price) + "원" binding.editText.text = priceText 먼저 editText에서 값을 가져온 후, NumberFormat을 사용해서 숫자 3개 마다 쉼표를 사용할 수 있도록 설정합니다. 이후 가져온 값에 해당 형식을 적용하고, 이를 editText에 적용.. 오픈소스 라이센스 명시 안녕하세요? 닉네임간편입니다. 앱을 개발하면서 오픈소스 라이브러리를 사용하는 경우가 많은데요, 실제 상용되고 있는 서비스에서도 오픈소스 라이브러리를 많이 활용합니다. 그런데 오픈소스 라이브러리도 마음대로 사용할 수는 없는데요, 라이센스를 명시해주어야 하기 때문입니다. 이번 시간에는 모든 라이센스에 대해서 다루어보기보다는, 오픈소스 라이브러리를 사용했을 때 어떤 식으로 라이센스를 명시해야 하는지에 대해서 말씀드리겠습니다. 1. 앱에서 명시 위 사진처럼 오픈소스 라이브러리 이름, 원문 주소, 원 저작자, 라이센스 종류 및 전문을 넣은 화면을 앱에서 볼 수 있도록 만들어주면 됩니다. 설정에서 클릭하도록 하시거나 따로 화면을 만드시면 될 것 같습니다. 2. 깃허브에 명시 깃허브의 경우 License 파일을 만들.. ExpandableListView - 확장 가능한 리스트뷰 안녕하세요? 닉네임간편입니다. 이번 시간에는 확장이 가능한 리스트뷰에 대해서 다루어보겠습니다. 1. 개요 아래 그림처럼 한 아이템을 클릭하면 리스트 형식의 아이템이 보였다가 사라지는 위젯입니다. ListView의 일종이기에 사용 방법은 유사하지만, ExpandableListView는 부모 아이템과 자식 아이템이 있다는 차이가 있습니다. 2. 만드는 법 앞서 말씀드린듯 ListView를 만드는 방식과 유사합니다. 먼저 이 뷰를 구현하기 위해선 다음과 같은 요소들이 필요합니다. 1) ExpandableListView 이 뷰를 표시할 레이아웃에 위젯을 추가해야 합니다. 전 ConstraintLayout 내부에서 사용했으므로 아래와 같이 추가했습니다. 이때 주의해야 할 점이 하나 있습니다. 개발자 문서에 따르면.. scope(스코프) 함수 안녕하세요? 닉네임간편입니다. 이번 시간에는 스코프 함수에 대해서 알아보겠습니다. 1. 개요 스코프 함수는 코드를 축약해서 표현할 수 있도록 도와주는 함수입니다. 스코프 함수는 객체의 context 내부에서 코드 블록을 실행하는 단일 목적을 갖고 있습니다. 스코프 함수의 종류에는 run, let, apply, also, with이 있습니다. 기본적으로 이 함수들은 유사한 기능을 수행하는데, 그 기능은 바로 객체의 코드 블록을 실행하는 것입니다. 그러나 이 함수들은 객체의 context를 참조하는 방식과 반환값에 있어서 차이가 있습니다. 따라서 이 차이점을 두고 스코프 함수들을 설명하겠습니다. 2. 차이점 1 - 객체 context 참조 방식 참조 방식에는 크게 this와 it이 있습니다. this는 람다.. 이전 1 2 3 다음