Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[feat] 리스트 뷰 <-> 검색 뷰 <-> 지도 뷰 플로우 구현 #203

Merged
merged 25 commits into from
Mar 2, 2024

Conversation

jihyunniiii
Copy link
Collaborator

@jihyunniiii jihyunniiii commented Feb 25, 2024

Related issue 🛠

Work Description ✏️

  • 리스트뷰 <-> 검색 뷰 <-> 지도 뷰 플로우를 구현하였습니다.
    • HomeFragment AppBar 검색 버튼 클릭 시 검색 뷰로 이동
    • 이전 Fragment가 무엇인지에 따른 검색 뷰 분기 처리 (검색 뷰 안내 텍스트 및 EditText Hint, 검색 뷰 완료 후 이동화면)
    • 검색 여부에 따른 HomeFragment 분기처리 (AppBar)
    • 검색 여부에 따른 MainListFragment 분기처리 (EmptyView)
    • HomeFragment SearchBar 클릭 이벤트 (EditText 클릭 시 검색어 유지된 채로 검색 뷰로 이동, x 클릭 시 검색어 사라진 채로 검색뷰로 이동)

Screenshot 📸

Screen_recording_20240301_144113.mp4

Uncompleted Tasks 😅

  • 전체적인 스택 관리 전체적인 스택 관리 (검색 뷰에서 뒤로 가기 클릭 시 -> 기존에 있던 뷰 + 검색어 초기화, 검색 중 + 홈 -> 검색뷰)
  • 실기기에서 엔터 클릭 시 서버 통신이 이뤄지지 않는 문제 해결
  • HomeFragment 칩 위치 수정

To Reviewers 📢

  • 현재 HomeFragment에서 보여지고 있는 Fragment를 나타내기 위해 HomeViewType을 만들었습니다. -> 얘를 이용해서 전환 FAB 이미지, SearchView 분기처리를 해주었습니다.
  • 전체적인 핑글 뷰에 EditText지만 클릭되면 안 되는 EditText가 많은데 (ㅋㅋ 이거 말이 이상하긴 한데 그,, 입력을 위한 EditText가 아닌 거 뭔지 아시죠? ㅋㅋ) 저는 이걸 isFocusable 을 false로 설정해주어서 해결했습니당 앱잼 때 이거 잘 안 돼서 Include로 한 걸로 아는데 한 번 확인해보면 좋을 것 같습니다 ~
  • 뒤로가기 로직,,, 정말 어렵네요,,, 어찌저찌 했는데,, 지금 되어야 하는게
    1. 검색 뷰에서 뒤로가기 -> 기존에 있던 뷰 (Map or Main List) + 검색어 초기화
    2. 검색 X + 지도/리스트뷰 -> 정말 앱을 종료하시겠습니다 토스트 + 앱 종료
    3. 검색 O + 지도/리스트뷰 -> 검색 뷰
      요거 3가진데요,, 검색 뷰 뒤로가기는 딱히 문제가 되지 않는 것 같은데요 검색 여부에 따른 지도/리스트뷰의 지도/리스트뷰의 콜백 분기처리를 구현한 방식이 좋은 방법인지 모르겠어요 ㅠ 현재 isSearching 값이 변화할 때마다 콜백을 add 해주고 remove 해주는 방식으로 구현했서요,,,,,, ㅠㅠㅠㅠㅠㅠ

Copy link
Member

@DoReMinWoo DoReMinWoo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

고생하셨습니다!

검색화면에서 뒤로갔다 다시가면 검색값이 없는 문제요!!
검색화면 onCreate될 때 editText 값을 뷰모델에서 가지고 있다가 null이 아니면 보여주는걸로는 안되는 건가요?

@@ -46,7 +46,7 @@ class JoinGroupSearchActivity :
finish()
}

(pingleSearchJoinGroupSearch.editText).let { searchEditText ->
(pingleSearchJoinGroupSearch.binding.etSearchPingleEditText).let { searchEditText ->
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

오홍 이런식으로 한 번 더 바인딩에 접근할 수 있군요

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

원래 editText만 접근 가능하게 SearchBar를 만들어 놨었는데 x 버튼 등에도 접근이 필요해서 약간 수정을 했습니다요 ㅋㅋ

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

버전대응 굳굳

@jihyunniiii
Copy link
Collaborator Author

고생하셨습니다!

검색화면에서 뒤로갔다 다시가면 검색값이 없는 문제요!! 검색화면 onCreate될 때 editText 값을 뷰모델에서 가지고 있다가 null이 아니면 보여주는걸로는 안되는 건가요?

이게 뭔 문제인가요??? 저 이해력이,,, 제송합니다,, 한 번만 다시 설명을 ㅜ

Copy link
Collaborator

@HAJIEUN02 HAJIEUN02 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

고생핑! 아직 짧은 지식이라 꼼꼼히 봐도.. 전 좋아보이네요 콜백 으렵따 으려워

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

미쳐따 난 여기 model을 어떤 식으로 활용해야 될지 아직도 잘 모르겠서요 ㅜㅜ 이번에 나의 단체에서 단체 바꿀 때 써보려 그러긴 했는데

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

presentation 계층의 모델,,, 저는 보통 인텐트로 data class 값을 넘길 때 사용하는 편입니둥,,
인텐트로 넘길 수 있는 형태가 제한되어 있는 거 아시나용?? 그래서 보통 data class를 넘기고자 할 때 Parcelable 형태로 만들어서 넘긴답니다!
근데 또 막상 플젝을 하면 대부분의 것들은 서버에서 받아오니까 크게 쓸 일이 없는 것 같아요.

나의 단체는 하나의 액티비티가 아닌가용?? 하나의 액티비티에서는 인텐트로 값을 넘길 필요가 없으니까 presentation 계층에 모델을 안 만들어도 될 것 같아욤

@@ -25,6 +33,8 @@ class HomeFragment : BindingFragment<FragmentHomeBinding>(R.layout.fragment_home
private val homeViewModel: HomeViewModel by activityViewModels()
private lateinit var fragmentList: ArrayList<Fragment>
private lateinit var fragmentStateAdapter: PingleFragmentStateAdapter
private lateinit var resultLauncher: ActivityResultLauncher<Intent>
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이건 검색 뷰에서 다시 홈으로 넘어왔을 때 정보를 남겨두려고 선언해두신 거 맞나용? 그냥 finish() 해주면 값이 남아있지 않나요?!

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

정보를 남겨두기 위해서가 아니라 액티비티에서 다른 액티비티로 전환 후 결과를 받아와야 해서 사용했습니다.
A 액티비티에서 B 액티비티로 전환을 한다고 할 때 A에서 B로 데이터를 전달해야 할 때는 intent의 PutExtra를 사용하잖아요! 근데 반대로 B가 종료된 후 다시 A 화면으로 이동했을 때 B의 데이터를 A로 가져와서 사용해야 하는 경우에는 registerForActivityResult를 사용합니다 !
여기에서는 홈 프래그먼트에서 검색 액티비티로 이동한 후 검색 액티비티가 종료되었을 때 검색 창에 입력된 검색어 값을 가져와야 해서 이용했어요

@@ -51,11 +63,27 @@ class HomeFragment : BindingFragment<FragmentHomeBinding>(R.layout.fragment_home
}

tvHomeGroup.text = homeViewModel.getGroupName()

with(pingleSearchHomeSearch.binding.etSearchPingleEditText) {
isFocusable = false
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

오호 이게 입력이 안 되도록 하는 그 칭구군요..

},
false
)
with(homeViewModel) {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

깔끔핑 굿굿핑

if (isSearching) View.VISIBLE else View.GONE
tvHomeGroup.visibility = if (isSearching) View.GONE else View.VISIBLE
ivHomeSearch.visibility = if (isSearching) View.GONE else View.VISIBLE
if (isSearching) setStopSearchCallback() else stopSearchCallback.remove()
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이렇게 콜백 add해주고 remove 해주는 로직 아니면 콜백을 여러개 선언해주는 로직 둘 중에 하나를 선택해야 하는 거 아닌가요? 다른 방법 생각하구 계신 게 있을까용,, 전 뭔가 이게 최선 같아요 아직 잘 몰라서 그런 걸 수도 있지만은..ㅜ 다은핑 나와주세요...

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

콜백을 계속 add 하는게 메모리 적으로 문제가 클 것 같아서,, 다른 방법(OnBackPressedCallback의 Enabled 속성을 조절하는,,)을 쓰고 싶었는데 안 되더라구요,, 그래서 remove를 통해 메모리 문제를 잡으려고 노력했는데 다른 방법이 있을까 궁금합니다,,, (도와줘 안핑이들)

).let { searchDescription ->
SpannableString(searchDescription).apply {
searchDescription.indexOf(getString(searchDescriptionRes))
.takeIf { it != INVALID_INDEX }?.let { index ->
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

오호 저한테 코리 달아주신 부분 takeIf 적용해서 구현하셨군용 ~ ~ 제가 구현해둔 것도 함 봐주세여 ㅋ 온보딩 추가 설명 뷰입니다

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

야무지게 잘 했더라구요 칭찬핑 ~ 근데 이거 많이 쓰여서 나중에 확장함수로 빼려구영 ㅋㅋ

import android.os.Build.VERSION_CODES.TIRAMISU
import android.os.Parcelable

inline fun <reified T : Parcelable> Intent.getCompatibleParcelableExtra(key: String): T? = when {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

헐 대박 뭔가 하고 찾아봤는데 사용자가 사용하고 있는 안드로이드 버전에 따라 분기를 고려한 코드군요... 너무 싱기해요

@@ -20,7 +20,7 @@
android:layout_marginVertical="12dp"
android:layout_marginStart="14dp"
android:background="@null"
android:imeOptions="actionDone"
android:imeOptions="actionSearch"
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

아하 이거 좋네요 키보드에 엔터 이모티콘 대신 서치 이모티콘이 나오도록 하는 사소하지만 좋은 속성이었군용.

이거 읽어보실래요.. 넘 신기해요

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So 신기핑 !!!!

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

집에 가서 마저 보겠슘 ~

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

아니 사실 안 봄 ㅋㅋ 근데 코드를 봐야할 거 같아서 집 가서 볼게염

@DoReMinWoo
Copy link
Member

고생하셨습니다!
검색화면에서 뒤로갔다 다시가면 검색값이 없는 문제요!! 검색화면 onCreate될 때 editText 값을 뷰모델에서 가지고 있다가 null이 아니면 보여주는걸로는 안되는 건가요?

이게 뭔 문제인가요??? 저 이해력이,,, 제송합니다,, 한 번만 다시 설명을 ㅜ

앗! 제가 헷갈린거같아요 ㅋㅎㅋㅋ 아닙니다

@jihyunniiii jihyunniiii merged commit f968fad into develop Mar 2, 2024
1 check passed
@jihyunniiii jihyunniiii deleted the feat-list-search-map branch March 2, 2024 03:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
Status: Done
Development

Successfully merging this pull request may close these issues.

[feat] 리스트 뷰 <-> 검색 뷰 <-> 지도 뷰 플로우 구현
4 participants