Skip to content

Commit ffa88b2

Browse files
committed
[FIX] #267 newInstance 함수로 프래그먼트 생성자 만들어서 화면 회전과 같은 상태 변경에 대응할 수 있도록 구현
1 parent 2eb0c18 commit ffa88b2

File tree

7 files changed

+111
-63
lines changed

7 files changed

+111
-63
lines changed

app/src/main/java/com/runnect/runnect/presentation/detail/CourseDetailActivity.kt

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import com.runnect.runnect.presentation.login.LoginActivity
3636
import com.runnect.runnect.presentation.mypage.upload.MyUploadActivity
3737
import com.runnect.runnect.presentation.state.UiStateV2
3838
import com.runnect.runnect.util.custom.dialog.CommonDialogFragment
39+
import com.runnect.runnect.util.custom.dialog.CommonDialogText
3940
import com.runnect.runnect.util.custom.popup.PopupItem
4041
import com.runnect.runnect.util.custom.dialog.RequireLoginDialogFragment
4142
import com.runnect.runnect.util.custom.popup.RunnectPopupMenu
@@ -318,10 +319,12 @@ class CourseDetailActivity :
318319

319320

320321
private fun showStopEditingDialog() {
321-
val dialog = CommonDialogFragment(
322-
getString(R.string.dialog_my_upload_course_detail_stop_editing_desc),
323-
getString(R.string.dialog_course_detail_stop_editing_no),
324-
getString(R.string.dialog_course_detail_stop_editing_yes),
322+
val dialog = CommonDialogFragment.newInstance(
323+
CommonDialogText(
324+
getString(R.string.dialog_my_upload_course_detail_stop_editing_desc),
325+
getString(R.string.dialog_course_detail_stop_editing_no),
326+
getString(R.string.dialog_course_detail_stop_editing_yes)
327+
),
325328
onNegativeButtonClicked = {},
326329
onPositiveButtonClicked = {
327330
// 편집 모드 -> 뒤로가기 버튼 -> 편집 중단 확인 -> 뷰에 원래 제목으로 보여줌.
@@ -349,10 +352,12 @@ class CourseDetailActivity :
349352
}
350353

351354
private fun showCourseDeleteDialog() {
352-
val dialog = CommonDialogFragment(
353-
getString(R.string.dialog_my_upload_course_detail_delete_desc),
354-
getString(R.string.dialog_course_detail_delete_no),
355-
getString(R.string.dialog_course_detail_delete_yes),
355+
val dialog = CommonDialogFragment.newInstance(
356+
CommonDialogText(
357+
getString(R.string.dialog_my_upload_course_detail_delete_desc),
358+
getString(R.string.dialog_course_detail_delete_no),
359+
getString(R.string.dialog_course_detail_delete_yes)
360+
),
356361
onNegativeButtonClicked = {},
357362
onPositiveButtonClicked = { viewModel.deleteUploadCourse(courseDetail.id) }
358363
)
@@ -454,7 +459,7 @@ class CourseDetailActivity :
454459
}
455460
}
456461

457-
private fun <T: Any> T.toCourseDetailContents(): CourseDetailContents? {
462+
private fun <T : Any> T.toCourseDetailContents(): CourseDetailContents? {
458463
return when (this) {
459464
is CourseDetail -> CourseDetailContents(title, description)
460465
is PublicCourse -> CourseDetailContents(title, description)

app/src/main/java/com/runnect/runnect/presentation/mypage/history/detail/MyHistoryDetailActivity.kt

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import com.runnect.runnect.databinding.ActivityMyHistoryDetailBinding
1919
import com.runnect.runnect.presentation.mypage.history.MyHistoryActivity
2020
import com.runnect.runnect.presentation.state.UiStateV2
2121
import com.runnect.runnect.util.custom.dialog.CommonDialogFragment
22+
import com.runnect.runnect.util.custom.dialog.CommonDialogText
2223
import com.runnect.runnect.util.custom.popup.PopupItem
2324
import com.runnect.runnect.util.custom.popup.RunnectPopupMenu
2425
import com.runnect.runnect.util.extension.getCompatibleSerializableExtra
@@ -283,21 +284,25 @@ class MyHistoryDetailActivity :
283284
}
284285

285286
private fun showHistoryDeleteDialog() {
286-
val dialog = CommonDialogFragment(
287-
getString(R.string.dialog_my_history_detail_delete_desc),
288-
getString(R.string.dialog_course_detail_delete_no),
289-
getString(R.string.dialog_course_detail_delete_yes),
287+
val dialog = CommonDialogFragment.newInstance(
288+
CommonDialogText(
289+
getString(R.string.dialog_my_history_detail_delete_desc),
290+
getString(R.string.dialog_course_detail_delete_no),
291+
getString(R.string.dialog_course_detail_delete_yes)
292+
),
290293
onNegativeButtonClicked = {},
291294
onPositiveButtonClicked = { viewModel.deleteHistory() }
292295
)
293296
dialog.show(supportFragmentManager, TAG_MY_HISTORY_DELETE_DIALOG)
294297
}
295298

296299
private fun showStopEditingDialog() {
297-
val dialog = CommonDialogFragment(
298-
getString(R.string.dialog_my_history_detail_stop_editing_desc),
299-
getString(R.string.dialog_course_detail_stop_editing_no),
300-
getString(R.string.dialog_course_detail_stop_editing_yes),
300+
val dialog = CommonDialogFragment.newInstance(
301+
CommonDialogText(
302+
getString(R.string.dialog_my_history_detail_stop_editing_desc),
303+
getString(R.string.dialog_course_detail_stop_editing_no),
304+
getString(R.string.dialog_course_detail_stop_editing_yes)
305+
),
301306
onNegativeButtonClicked = {},
302307
onPositiveButtonClicked = {
303308
// 편집 모드 -> 뒤로가기 버튼 -> 편집 중단 확인 -> 뷰에 원래 제목으로 보여줌.

app/src/main/java/com/runnect/runnect/util/custom/CommonDialogFragment.kt

Lines changed: 0 additions & 46 deletions
This file was deleted.
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package com.runnect.runnect.util.custom.dialog
2+
3+
import android.os.Bundle
4+
import android.view.View
5+
import com.runnect.runnect.R
6+
import com.runnect.runnect.binding.BindingDialogFragment
7+
import com.runnect.runnect.databinding.FragmentCommonDialogBinding
8+
import com.runnect.runnect.util.extension.getCompatibleParcelableExtra
9+
10+
class CommonDialogFragment
11+
: BindingDialogFragment<FragmentCommonDialogBinding>(R.layout.fragment_common_dialog) {
12+
private var onNegativeButtonClicked: () -> Unit = {}
13+
private var onPositiveButtonClicked: () -> Unit = {}
14+
15+
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
16+
super.onViewCreated(view, savedInstanceState)
17+
dialog?.setCanceledOnTouchOutside(false)
18+
initDialogText()
19+
initNegativeButtonClickListener()
20+
initPositiveButtonClickListener()
21+
}
22+
23+
private fun initDialogText() {
24+
binding.dialogText = arguments?.getCompatibleParcelableExtra(ARG_COMMON_DIALOG)
25+
}
26+
27+
private fun initNegativeButtonClickListener() {
28+
binding.btnCommonDialogNegative.setOnClickListener {
29+
onNegativeButtonClicked.invoke()
30+
dismiss()
31+
}
32+
}
33+
34+
private fun initPositiveButtonClickListener() {
35+
binding.btnCommonDialogPositive.setOnClickListener {
36+
onPositiveButtonClicked.invoke()
37+
dismiss()
38+
}
39+
}
40+
41+
companion object {
42+
private const val ARG_COMMON_DIALOG = "common_dialog_params"
43+
44+
@JvmStatic
45+
fun newInstance(
46+
commonDialogText: CommonDialogText,
47+
onNegativeButtonClicked: () -> Unit,
48+
onPositiveButtonClicked: () -> Unit
49+
) = CommonDialogFragment().apply {
50+
arguments = Bundle().apply {
51+
putParcelable(ARG_COMMON_DIALOG, commonDialogText)
52+
}
53+
this.onNegativeButtonClicked = onNegativeButtonClicked
54+
this.onPositiveButtonClicked = onPositiveButtonClicked
55+
}
56+
}
57+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.runnect.runnect.util.custom.dialog
2+
3+
import android.os.Parcelable
4+
import kotlinx.android.parcel.Parcelize
5+
6+
@Parcelize
7+
data class CommonDialogText(
8+
val description: String,
9+
val negativeButtonText: String,
10+
val positiveButtonText: String
11+
): Parcelable

app/src/main/java/com/runnect/runnect/util/extension/BundleExt.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,14 @@ package com.runnect.runnect.util.extension
33
import android.os.Build.VERSION.SDK_INT
44
import android.os.Build.VERSION_CODES.TIRAMISU
55
import android.os.Bundle
6+
import android.os.Parcelable
67
import java.io.Serializable
78

9+
inline fun <reified T : Parcelable> Bundle.getCompatibleParcelableExtra(key: String): T? = when {
10+
SDK_INT >= TIRAMISU -> getParcelable(key, T::class.java)
11+
else -> getParcelable(key) as? T
12+
}
13+
814
inline fun <reified T : Serializable> Bundle.getCompatibleSerializableExtra(key: String): T? = when {
915
SDK_INT >= TIRAMISU -> getSerializable(key, T::class.java)
1016
else -> getSerializable(key) as? T

app/src/main/res/layout/fragment_common_dialog.xml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,13 @@
33
xmlns:app="http://schemas.android.com/apk/res-auto"
44
xmlns:tools="http://schemas.android.com/tools">
55

6+
<data>
7+
8+
<variable
9+
name="dialogText"
10+
type="com.runnect.runnect.util.custom.dialog.CommonDialogText" />
11+
</data>
12+
613
<FrameLayout
714
android:layout_width="match_parent"
815
android:layout_height="wrap_content">
@@ -22,6 +29,7 @@
2229
android:fontFamily="@font/pretendard_medium"
2330
android:gravity="center"
2431
android:lineHeight="22sp"
32+
android:text="@{dialogText.description}"
2533
android:textColor="@color/G2"
2634
android:textSize="14sp"
2735
app:layout_constraintEnd_toEndOf="parent"
@@ -49,6 +57,7 @@
4957
android:fontFamily="@font/pretendard_semibold"
5058
android:padding="12dp"
5159
android:stateListAnimator="@null"
60+
android:text="@{dialogText.negativeButtonText}"
5261
android:textColor="@color/M1"
5362
android:textSize="15sp"
5463
tools:text="취소" />
@@ -63,6 +72,7 @@
6372
android:fontFamily="@font/pretendard_semibold"
6473
android:padding="12dp"
6574
android:stateListAnimator="@null"
75+
android:text="@{dialogText.positiveButtonText}"
6676
android:textColor="@color/white"
6777
android:textSize="15sp"
6878
tools:text="삭제하기" />

0 commit comments

Comments
 (0)