카테고리 없음

TIL (04.11)

내손은개발 🐾 2024. 4. 11. 21:43

CodeKata


 

[프로그래머스_Kotlin] 귤 고르기

프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 경

rlawog.tistory.com

 

 

 

Android


 

1. AlertDialog

사용자들이 이용하기 쉽게 팝업 형식의 다이얼로그이다.

전부 Fragment를 사용하였다.

 

기본적인 확인/취소 Dialog

더보기
    private fun dialogBase(){
        val alertDialog = AlertDialog.Builder(requireContext())
            .setTitle("권한")
            .setMessage("권한을 허용하시겠습니까?")
            .setPositiveButton("허용"){dialog,_ ->
                dialog.dismiss()
            }
            .setNegativeButton("거부"){dialog,_ ->
                dialog.dismiss()
            }
            .create()
        alertDialog.show()
    }

 

 

Custom Dialog

recyclerView의 item처럼 제작한 layout을 띄울 수 있다. 

더보기

간단한 이름, 닉네임 작성

layout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="16dp"
        android:orientation="vertical">

        <EditText
            android:id="@+id/editText"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:ems="10"
            android:inputType="textPersonName"
            android:text="Name" />

        <EditText
            android:id="@+id/editText2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:ems="10"
            android:inputType="textPersonName"
            android:text="AGE" />
    </LinearLayout>
</LinearLayout>

 

 

 적용

 private fun dialogCustom() {
        val builder = AlertDialog.Builder(requireContext())
        val inflater = requireActivity().layoutInflater
        val dialogView = inflater.inflate(R.layout.dialog_custom, null)
        val dialogBinding = DialogCustomBinding.bind(dialogView)

        builder.setView(dialogView)
            .setPositiveButton("저장") { _, _ ->
                val name = dialogBinding.editText.text.toString()
                val nickname = dialogBinding.editText2.text.toString()

                Toast.makeText(requireContext(), "$name $nickname", Toast.LENGTH_SHORT).show()
            }
            .setNegativeButton("취소") { _, _ ->
            }
            .create()
            .show()
    }

 

 

DatePickerDialog(날짜 선택)

더보기
private fun dialogDatePicker() {
        val calendar = Calendar.getInstance()
        val year = calendar.get(Calendar.YEAR)
        val month = calendar.get(Calendar.MONTH)
        val day = calendar.get(Calendar.DATE)

        val datePickerDialog = DatePickerDialog(requireContext(), { _, myYear, myMonth, myDay ->
            val selectedDate = "$myYear-${myMonth + 1}-$myDay"
            Toast.makeText(requireContext(), selectedDate, Toast.LENGTH_SHORT).show()

        }, year, month, day)
        datePickerDialog.show()
    }

 

TimePickerDialog(시간 선택)

더보기
    private fun dialogTimePicker() {
        val calendar = Calendar.getInstance()
        val hour = calendar.get(Calendar.HOUR_OF_DAY)
        val minute = calendar.get(Calendar.MINUTE)

        val timePickerDialog = TimePickerDialog(
            requireContext(), { _, myHour, myMinute ->
                val selectedTime = "$myHour : $myMinute"
                Toast.makeText(requireContext(), selectedTime, Toast.LENGTH_SHORT).show()
            }, hour, minute, true
        )
        timePickerDialog.show()
    }

 

 

2. Fragment에서의 Binding

 

생각없이 Activity 사용할 때 처럼 Fragment를 사용하면서 binding을 사용했는데 학습하면서 다들 destoryView()에서 binding에 null값을 주길래 혹시? 하고 찾아보니까 정말이였다.

 

ViewBinding을 Fragment에서 사용하게 될 경우 Memory leak과 관련된 이슈가 있다.

Fragment에 있는 뷰들이 원래보다 오래 살아있을 수 있기 때문에 이런 증상이 발생한다는 것이다.

구글이 Fragment를 리팩토링하면서 기본적으로 fragment에 있는 뷰를 fragment가 종료되어도 살 수 있도록 변경했기 때문이다. 그렇기 때문에 binding이 레퍼런스를 계속 가지고 있기 때문에 회수하지 못하고 메모리 누수가 발생하게 된다.

 

매번 destoryView에서 binding의 null값을 주는 반복적인 코드를 사용하지 않는 방법들이 있지만 일단은 나는 destoryView에 null값을 주고 사용하고 Fragment 사용에 더 익숙해지면 다른 방법에 대해 정리할 생각이다.

 

 

 

ref

 

뷰 결합  |  Android 개발자  |  Android Developers

이 페이지는 Cloud Translation API를 통해 번역되었습니다. 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 뷰 결합은 뷰와 상호작용하는 코드를 더 쉽게 작성할

developer.android.com

 

Fragment에서 ViewBinding 메모리누수 방지하기

Kotlin사용자라면 Sythetic pulgin이 deprecated되고 ViewBinding(구글의 권장사항)으로 마이그레이션 해야된다는 걸 알고 있을 것이다. 그런데 ViewBinding을 프레그먼트에서 사용하게 될 경우 Memory leak과 관련

bignerdranch.tistory.com

 

 

안드로이드 개발 (29) Fragment에서 ViewBinding 사용 시 주의할 점

1. ViewBinding ViewBinding 은 xml를 자동으로 바인딩 클래스로 생성해서 xml의 View를 안전하게 사용할 수 있습니다. kotlin extension deprecated 이 되고나서 요즘은 ViewBinding, DataBinding을 위주로 사용하는 추세

gift123.tistory.com