v1.1.2 - 하루 메모 키보드 가림 완벽 개선 (상단 즉시 저장 버튼, 뒤로가기 시 자동 저장 및 스크롤 지원)

This commit is contained in:
sanjeok77
2026-08-14 10:39:13 +09:00
parent d012b178b7
commit d993619ff8
6 changed files with 216 additions and 172 deletions
+2 -2
View File
@@ -20,8 +20,8 @@ android {
applicationId = "com.example.shiftalarm"
minSdk = 26
targetSdk = 35
versionCode = 111
versionName = "1.1.1"
versionCode = 112
versionName = "1.1.2"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
@@ -657,6 +657,20 @@ class MainActivity : AppCompatActivity() {
}
}
val saveAndCloseMemo = {
val content = etMemo.text.toString().trim()
lifecycleScope.launch {
repo.setMemo(date, content)
updateCalendar()
}
dialog.dismiss()
}
dialogView.findViewById<android.view.View>(R.id.btnQuickSaveMemo).setOnClickListener {
saveAndCloseMemo()
Toast.makeText(this@MainActivity, "메모가 저장되었습니다.", Toast.LENGTH_SHORT).show()
}
dialogView.findViewById<android.view.View>(R.id.btnClearMemo).setOnClickListener {
etMemo.setText("")
lifecycleScope.launch {
@@ -667,15 +681,22 @@ class MainActivity : AppCompatActivity() {
}
dialogView.findViewById<android.view.View>(R.id.btnClose).setOnClickListener {
saveAndCloseMemo()
}
// Auto-save when dialog is dismissed (e.g., Back key or touching outside)
dialog.setOnDismissListener {
val content = etMemo.text.toString().trim()
lifecycleScope.launch {
val content = etMemo.text.toString().trim()
repo.setMemo(date, content)
updateCalendar()
dialog.dismiss()
}
}
dialog.show()
// Keyboard adjust resize
dialog.window?.setSoftInputMode(android.view.WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE)
}
private suspend fun handleDaySettingAction(date: LocalDate, selected: String, team: String, factory: String) {
+174 -147
View File
@@ -7,169 +7,196 @@
app:cardElevation="8dp"
app:cardBackgroundColor="@android:color/transparent">
<LinearLayout
<androidx.core.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="@drawable/bg_dialog_solid_v4"
android:padding="20dp">
<!-- Header: Date and Shift -->
android:fillViewport="true"
android:overScrollMode="never">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:gravity="center"
android:paddingTop="8dp"
android:paddingBottom="20dp">
<TextView
android:id="@+id/dialogSubtitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="내일의 근무"
android:textSize="14sp"
android:textColor="@color/text_secondary"
android:layout_marginBottom="4dp"/>
<TextView
android:id="@+id/dialogTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="2월 12일 (주간)"
android:textSize="22sp"
android:textStyle="bold"
android:textColor="@color/text_primary"
android:letterSpacing="-0.02"/>
</LinearLayout>
<!-- 5-Column Grid Refactored -->
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<!-- Row 1 -->
<TextView android:id="@+id/btnJu" style="@style/ShiftCircleButton" android:text="주" android:textColor="@color/shift_ju"/>
<TextView android:id="@+id/btnSeok" style="@style/ShiftCircleButton" android:text="석" android:textColor="@color/shift_seok"/>
<TextView android:id="@+id/btnYa" style="@style/ShiftCircleButton" android:text="야" android:textColor="@color/shift_ya"/>
<TextView android:id="@+id/btnJuMat" style="@style/ShiftCircleButton" android:text="주맞" android:textSize="13sp" android:textColor="@color/shift_jumat"/>
<TextView android:id="@+id/btnYaMat" style="@style/ShiftCircleButton" android:text="야맞" android:textSize="13sp" android:textColor="@color/shift_yamat"/>
<!-- Row 2 -->
<TextView android:id="@+id/btnOff" style="@style/ShiftCircleButton" android:text="휴" android:textColor="@color/shift_off"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"/>
<TextView android:id="@+id/btnWolcha" style="@style/ShiftCircleButton" android:text="월차" android:textSize="13sp" android:textColor="@color/secondary"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"/>
<TextView android:id="@+id/btnYeoncha" style="@style/ShiftCircleButton" android:text="연차" android:textSize="13sp" android:textColor="@color/secondary"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"/>
<TextView android:id="@+id/btnBanwol" style="@style/ShiftCircleButton" android:text="반월" android:textSize="13sp" android:textColor="@color/shift_red"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"/>
<TextView android:id="@+id/btnBannyeon" style="@style/ShiftCircleButton" android:text="반년" android:textSize="13sp" android:textColor="@color/shift_red"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"/>
<!-- Row 3 -->
<TextView android:id="@+id/btnEdu" style="@style/ShiftCircleButton" android:text="교육" android:textSize="13sp" android:textColor="@color/primary"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"/>
<TextView android:id="@+id/btnReset" style="@style/ShiftCircleButton" android:text="초기" android:textSize="13sp" android:textColor="@color/text_secondary"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"/>
<TextView android:id="@+id/btnManual" style="@style/ShiftCircleButton" android:text="직접" android:textSize="14sp" android:textColor="@color/shift_gray"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"/>
<androidx.constraintlayout.helper.widget.Flow
android:id="@+id/gridFlow"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:constraint_referenced_ids="btnJu,btnSeok,btnYa,btnJuMat,btnYaMat, btnOff,btnWolcha,btnYeoncha,btnBanwol,btnBannyeon, btnEdu,btnReset,btnManual"
app:flow_wrapMode="aligned"
app:flow_maxElementsWrap="5"
app:flow_horizontalStyle="packed"
app:flow_horizontalGap="8dp"
app:flow_verticalGap="12dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>
<View
android:id="@+id/memoDivider"
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/grid_divider"
android:layout_marginTop="20dp"/>
<!-- Memo Section -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_marginTop="16dp"
android:background="@drawable/bg_glass_button_light"
android:padding="16dp">
android:background="@drawable/bg_dialog_solid_v4"
android:padding="20dp">
<!-- Header: Date and Shift -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center_vertical"
android:layout_marginBottom="12dp">
android:orientation="vertical"
android:gravity="center"
android:paddingTop="4dp"
android:paddingBottom="16dp">
<TextView
android:id="@+id/memoTitle"
android:layout_width="0dp"
android:id="@+id/dialogSubtitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="하루 메모"
android:textSize="15sp"
android:textStyle="bold"
android:textColor="@color/text_primary"/>
android:text="내일의 근무"
android:textSize="14sp"
android:textColor="@color/text_secondary"
android:layout_marginBottom="4dp"/>
<ImageView
android:id="@+id/btnClearMemo"
android:layout_width="28dp"
android:layout_height="28dp"
android:src="@drawable/ic_delete"
app:tint="@color/shift_red"
android:padding="6dp"
android:background="?attr/selectableItemBackgroundBorderless"/>
<TextView
android:id="@+id/dialogTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="2월 12일 (주간)"
android:textSize="22sp"
android:textStyle="bold"
android:textColor="@color/text_primary"
android:letterSpacing="-0.02"/>
</LinearLayout>
<EditText
android:id="@+id/etMemo"
<!-- 5-Column Grid Refactored -->
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<!-- Row 1 -->
<TextView android:id="@+id/btnJu" style="@style/ShiftCircleButton" android:text="주" android:textColor="@color/shift_ju"/>
<TextView android:id="@+id/btnSeok" style="@style/ShiftCircleButton" android:text="석" android:textColor="@color/shift_seok"/>
<TextView android:id="@+id/btnYa" style="@style/ShiftCircleButton" android:text="야" android:textColor="@color/shift_ya"/>
<TextView android:id="@+id/btnJuMat" style="@style/ShiftCircleButton" android:text="주맞" android:textSize="13sp" android:textColor="@color/shift_jumat"/>
<TextView android:id="@+id/btnYaMat" style="@style/ShiftCircleButton" android:text="야맞" android:textSize="13sp" android:textColor="@color/shift_yamat"/>
<!-- Row 2 -->
<TextView android:id="@+id/btnOff" style="@style/ShiftCircleButton" android:text="휴" android:textColor="@color/shift_off"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"/>
<TextView android:id="@+id/btnWolcha" style="@style/ShiftCircleButton" android:text="월차" android:textSize="13sp" android:textColor="@color/secondary"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"/>
<TextView android:id="@+id/btnYeoncha" style="@style/ShiftCircleButton" android:text="연차" android:textSize="13sp" android:textColor="@color/secondary"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"/>
<TextView android:id="@+id/btnBanwol" style="@style/ShiftCircleButton" android:text="반월" android:textSize="13sp" android:textColor="@color/shift_red"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"/>
<TextView android:id="@+id/btnBannyeon" style="@style/ShiftCircleButton" android:text="반년" android:textSize="13sp" android:textColor="@color/shift_red"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"/>
<!-- Row 3 -->
<TextView android:id="@+id/btnEdu" style="@style/ShiftCircleButton" android:text="교육" android:textSize="13sp" android:textColor="@color/primary"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"/>
<TextView android:id="@+id/btnReset" style="@style/ShiftCircleButton" android:text="초기" android:textSize="13sp" android:textColor="@color/text_secondary"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"/>
<TextView android:id="@+id/btnManual" style="@style/ShiftCircleButton" android:text="직접" android:textSize="14sp" android:textColor="@color/shift_gray"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"/>
<androidx.constraintlayout.helper.widget.Flow
android:id="@+id/gridFlow"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:constraint_referenced_ids="btnJu,btnSeok,btnYa,btnJuMat,btnYaMat, btnOff,btnWolcha,btnYeoncha,btnBanwol,btnBannyeon, btnEdu,btnReset,btnManual"
app:flow_wrapMode="aligned"
app:flow_maxElementsWrap="5"
app:flow_horizontalStyle="packed"
app:flow_horizontalGap="8dp"
app:flow_verticalGap="12dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>
<View
android:id="@+id/memoDivider"
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/grid_divider"
android:layout_marginTop="16dp"/>
<!-- Memo Section with Quick Save Bar -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="여기에 메모를 입력하세요"
android:inputType="textMultiLine|textNoSuggestions"
android:minLines="2"
android:maxLines="4"
android:gravity="top|start"
android:textSize="15sp"
android:textColor="@color/text_primary"
android:background="@android:color/transparent"
android:padding="0dp"/>
android:orientation="vertical"
android:layout_marginTop="12dp"
android:background="@drawable/bg_glass_button_light"
android:padding="14dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center_vertical"
android:layout_marginBottom="8dp">
<TextView
android:id="@+id/memoTitle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="하루 메모"
android:textSize="15sp"
android:textStyle="bold"
android:textColor="@color/text_primary"/>
<ImageView
android:id="@+id/btnClearMemo"
android:layout_width="28dp"
android:layout_height="28dp"
android:src="@drawable/ic_delete"
app:tint="@color/shift_red"
android:padding="5dp"
android:background="?attr/selectableItemBackgroundBorderless"
android:layout_marginEnd="8dp"/>
<com.google.android.material.button.MaterialButton
android:id="@+id/btnQuickSaveMemo"
android:layout_width="wrap_content"
android:layout_height="32dp"
android:text="저장"
android:textSize="13sp"
android:textStyle="bold"
android:textColor="#FFFFFF"
app:cornerRadius="16dp"
android:backgroundTint="@color/primary"
android:paddingHorizontal="12dp"
android:paddingVertical="0dp"
android:minHeight="0dp"
android:minWidth="0dp"
app:icon="@drawable/ic_check"
app:iconSize="14dp"
app:iconTint="#FFFFFF"
app:iconPadding="4dp"/>
</LinearLayout>
<EditText
android:id="@+id/etMemo"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="여기에 메모를 입력하세요 (최대 4줄)"
android:inputType="textMultiLine|textNoSuggestions"
android:minLines="2"
android:maxLines="4"
android:gravity="top|start"
android:textSize="15sp"
android:textColor="@color/text_primary"
android:background="@android:color/transparent"
android:padding="2dp"/>
</LinearLayout>
<com.google.android.material.button.MaterialButton
android:id="@+id/btnClose"
android:layout_width="match_parent"
android:layout_height="52dp"
android:text="저장 및 닫기"
android:layout_marginTop="16dp"
android:textSize="16sp"
android:textStyle="bold"
android:textColor="#FFFFFF"
app:cornerRadius="26dp"
android:backgroundTint="@color/primary"
android:elevation="2dp"/>
</LinearLayout>
<com.google.android.material.button.MaterialButton
android:id="@+id/btnClose"
android:layout_width="match_parent"
android:layout_height="56dp"
android:text="저장 및 닫기"
android:layout_marginTop="24dp"
android:textSize="16sp"
android:textStyle="bold"
android:textColor="#FFFFFF"
app:cornerRadius="28dp"
android:backgroundTint="@color/primary"
android:elevation="2dp"/>
</LinearLayout>
</androidx.core.widget.NestedScrollView>
</androidx.cardview.widget.CardView>