라디오 다이얼로그 컴포넌트 제작기
2022. 11. 7. 14:51ㆍ개발/Android
좋은 코드는...추상화가 잘 된것.
당연함.
어디서든 갖다 쓸 수 있고. 다형성이 적절히 보장된 것...
최적은 아니지만 어쨌든 내 노력을 갈아서 했으니 기록하고자 오랜만에 글을 쓴다.
만든건 다이얼로그! 대부분의 다이얼로그가 존재하지만
라디오 버튼 + 텍스트 필드가 있는 기본 다이얼로그가 추가로 필요해서 만들었다.
1. 일단 공통 테마부터 만들어준다
<!--Dialog Theme-->
<style name="DialogTheme" parent="Theme.AppCompat.Dialog">
<item name="android:windowNoTitle">true</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowBackground">@color/opacity100</item>
<item name="android:colorBackgroundCacheHint">@null</item>
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
<item name="android:windowMinWidthMajor">100%</item>
<item name="android:windowMinWidthMinor">100%</item>
</style>
다이얼로그는 뭐..다 비슷하게 생겨먹었으니까 공통 테마를 하나 만들어준다.
2. 사용하고자 하는데서 상속해준다
class TwoBtnWithRadioDialog(
context: Context,
private val title: String,
private val sub_text: String,
private val radioButtonList: Array<String>,
private val textfieldVisible: Boolean,
private val textfieldHint: String,
private val leftListener: View.OnClickListener,
private val rightListener: View.OnClickListener,
) :
Dialog(context, R.style.DialogTheme)
이런식으로! 뷰를 공통적으로 가져가기 위함이다. 라디오가 아니라 원버튼, 투버튼 기본 다이얼로그 만들때 그대로 갖다쓰면 된다.
파라미터 목록을 보니 아직까지 완벽하게 예쁜 추상화가 된 것은 아닌것같지만...어쨌든...다음은 생성자다.
타이틀 / 서브텍스트 / 라디오버튼 리스트 / 텍스트필드 노출 여부 / 텍스트필드 힌트 / 왼 오 버튼 리스너 이렇게..받는다.
얘들의 각각 xml내 위치는 뭐 원하는데..ㅎㅎ넣으면 되고,
3. 라디오 그룹에 받은 리스트만큼 연결해준다
라디오는 그룹만 일단 생성해준다.(xml)
<RadioGroup
android:layout_marginTop="23sp"
android:id="@+id/radio_group"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/title_text"
app:layout_constraintStart_toStartOf="@id/text_field_layout">
</RadioGroup>
안의 리스트들은 바뀌겠지만.. 그룹은 어차피 하나니까 미리 생성해서 저기 아이디를 기억하고,
val parentLayout = binding.radioGroup
이렇게 pl로 선언해준다.
그 다음, 받은 라디오 리스트들을 연결해준다.
for (i in 0..radioButtonList.size - 1) parentLayout.addView(addRadioBtn(radioButtonList[i]))
이렇게~
나머지 텍스트필드나..뭐 이런건 그냥 받은거 바인딩만 하면 되고,
3. 마지막으로 리스너까지 연결해준다
아래처럼 연결하면 끝이다.
binding.okBtn.setOnClickListener {
dismiss()
if (leftListener != null) {
binding.okBtn.setOnClickListener(leftListener)
binding.okBtn.performClick()
}
}
binding.cancelBtn.setOnClickListener {
dismiss()
if (rightListener != null) {
binding.cancelBtn.setOnClickListener(rightListener)
binding.cancelBtn.performClick()
}
}
4. 사용예시
val reportReasonList = arrayOf(
context.getString(R.string.study_club_report_desc_1),
context.getString(R.string.study_club_report_desc_2),
context.getString(R.string.study_club_report_desc_3),
context.getString(R.string.study_club_report_desc_4)
)
TwoBtnWithRadioDialog(
context,
context.getString(R.string.study_club_report_raason_need_to_choose),
context.getString(R.string.study_club_report_precaution),
reportReasonList,
true,
context.getString(R.string.study_club_report_raason_reqiuire), {
listener.onReportPost(item)
}, {}).show()
'개발 > Android' 카테고리의 다른 글
onBackPressed() deprecated issuede (0) | 2023.03.10 |
---|---|
android sdk 31 타겟팅 (0) | 2022.11.17 |
Material UI 로 간단하게 깔끔한 UI 구현하기 - (1) (0) | 2022.08.29 |
RxJava vs Coroutines (0) | 2022.06.20 |
DI(종속 항목 삽입) (0) | 2022.05.12 |