From 911ff3003f2aead3e6afbaff860d79f71df2b6be Mon Sep 17 00:00:00 2001 From: sanjeok77 Date: Fri, 13 Mar 2026 00:02:38 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=ED=9C=B4=EA=B0=80=20=EA=B4=80=EB=A6=AC?= =?UTF-8?q?=20NumberPicker=20=E2=86=92=20Spinner=20=EB=B3=80=EA=B2=BD=20+?= =?UTF-8?q?=20=EC=A0=80=EC=9E=A5=20=EB=B2=84=ED=8A=BC=20=EB=B3=B5=EC=9B=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - NumberPicker 대신 Spinner(드롭다운) 사용 - 값 변경 시 자동 저장 제거하고 저장 버튼 복원 - 더 직관적인 UI 제공 Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode) Co-authored-by: Sisyphus --- .../example/shiftalarm/FragmentSettingsLab.kt | 61 ++++++++----------- .../main/res/layout/fragment_settings_lab.xml | 26 +++++++- 2 files changed, 52 insertions(+), 35 deletions(-) diff --git a/app/src/main/java/com/example/shiftalarm/FragmentSettingsLab.kt b/app/src/main/java/com/example/shiftalarm/FragmentSettingsLab.kt index 772e6e8..9af5596 100644 --- a/app/src/main/java/com/example/shiftalarm/FragmentSettingsLab.kt +++ b/app/src/main/java/com/example/shiftalarm/FragmentSettingsLab.kt @@ -4,18 +4,16 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.widget.NumberPicker +import android.widget.ArrayAdapter import androidx.fragment.app.Fragment import androidx.lifecycle.lifecycleScope import com.example.shiftalarm.databinding.FragmentSettingsLabBinding import kotlinx.coroutines.launch -import kotlinx.coroutines.delay class FragmentSettingsLab : Fragment() { private var _binding: FragmentSettingsLabBinding? = null private val binding get() = _binding!! - private var isInitialLoad = true override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -28,56 +26,51 @@ class FragmentSettingsLab : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - setupNumberPicker() + setupSpinner() loadAnnualLeave() + setupSaveButton() } - private fun setupNumberPicker() { - binding.npTotalDays.apply { - minValue = 1 - maxValue = 25 - wrapSelectorWheel = false - - // 값 변경 시 자동 저장 - setOnValueChangedListener { _, _, newVal -> - if (!isInitialLoad) { - saveAnnualLeave(newVal) - } - } - } + private fun setupSpinner() { + // 1~25일 선택 가능한 어댑터 설정 + val daysList = (1..25).map { "${it}일" }.toList() + val adapter = ArrayAdapter(requireContext(), android.R.layout.simple_spinner_item, daysList) + adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) + binding.spinnerTotalDays.adapter = adapter } private fun loadAnnualLeave() { lifecycleScope.launch { - isInitialLoad = true val repo = ShiftRepository(requireContext()) val annualLeave = repo.getAnnualLeave() annualLeave?.let { - binding.npTotalDays.value = it.totalDays.toInt() + // 저장된 값이 있으면 해당 위치 선택 (0-indexed) + binding.spinnerTotalDays.setSelection(it.totalDays.toInt() - 1) binding.tvRemainingDays.text = formatRemainingDays(it.remainingDays) } ?: run { - // Default: 15 days - binding.npTotalDays.value = 15 + // Default: 15 days (index 14) + binding.spinnerTotalDays.setSelection(14) binding.tvRemainingDays.text = "15" } - - // 초기 로드 완료 후 플래그 변경 - delay(100) - isInitialLoad = false } } - private fun saveAnnualLeave(totalDays: Int) { - lifecycleScope.launch { - val repo = ShiftRepository(requireContext()) + private fun setupSaveButton() { + binding.btnSaveAnnualLeave.setOnClickListener { + val selectedPosition = binding.spinnerTotalDays.selectedItemPosition + val totalDays = selectedPosition + 1 // 0-indexed to actual days - repo.recalculateAndSaveAnnualLeave(totalDays.toFloat()) - - val updated = repo.getAnnualLeave() - updated?.let { - binding.tvRemainingDays.text = formatRemainingDays(it.remainingDays) - showCustomToast(requireContext(), "총 연차 ${totalDays}일로 설정되었습니다 (남은 연차: ${formatRemainingDays(it.remainingDays)}일)") + lifecycleScope.launch { + val repo = ShiftRepository(requireContext()) + + repo.recalculateAndSaveAnnualLeave(totalDays.toFloat()) + + val updated = repo.getAnnualLeave() + updated?.let { + binding.tvRemainingDays.text = formatRemainingDays(it.remainingDays) + showCustomToast(requireContext(), "총 연차 ${totalDays}일로 저장되었습니다 (남은 연차: ${formatRemainingDays(it.remainingDays)}일)") + } } } } diff --git a/app/src/main/res/layout/fragment_settings_lab.xml b/app/src/main/res/layout/fragment_settings_lab.xml index d9e1bb3..edd2c2a 100644 --- a/app/src/main/res/layout/fragment_settings_lab.xml +++ b/app/src/main/res/layout/fragment_settings_lab.xml @@ -47,7 +47,10 @@ android:orientation="horizontal" android:gravity="center_vertical"> - android:id="@+id/npTotalDays" android:layout_width="60dp" android:layout_height="100dp"/> @@ -123,4 +126,25 @@ android:layout_marginBottom="8dp" android:gravity="center"/> + + + + + +