CodeKata
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