두번째 액티비티의 xml은 대충 작성이 끝났는데
외부 라이브러리를 사용해서 코틀린 파일에서 설정해주어야 하는 부분들이 남아서
잘 적용되는지 보려면 화면 이동을 해줘야하기때문에 네비게이션바에서 이동할 수 있게 추가해줌!
사실 원래는 머.. 네비게이션 바로 이동할 때, 특히 지금 내 상황에서는 프래그먼트라던지 그런거 써야될 것 같지만 배운개념 내에서 구현하는게 좋으니까 그냥 무식하게 했당~
먼가 검색 없이 대충 할 수 있을 것같아서
네비게이션 바를 코틀린 파일에 연동해주고,
.눌러서 setOnClickListner같이 생긴 애를 찾아서 쭉내리니까
setOnNavigationItemListener라는게 있길래
사용해주고, when문을 사용해서 각 페이지로 이동할 수 있게 해줬다.
navigateBar.setOnNavigationItemSelectedListener{item ->
when (item.itemId) {
R.id.home -> {
val intent = Intent(this,MainActivity::class.java)
startActivity(intent)
true
}
R.id.search -> {
intent = Intent(this,SearchActivity::class.java)
startActivity(intent)
true
}
R.id.library -> {
intent = Intent(this,LibraryActivity::class.java)
startActivity(intent)
true
}
else -> false
}
}
처음에는 ItemId 랑 R.id 안붙여주고, true도 안붙여줘서 안됐었음.
그래서 결국 검색 때려서 알아냈당~
뇌내망상으로 해결하고싶었는데 역시 쉽지않당~
LibraryActivity는 아직 구현은안했지만 빈액티비티 그냥 만들어서 넣어놨음
그리고 SearchActivity에도 네비게이션바를 추가해줬는데,
이게 Fragment를 쓰거나하는게아니라 그냥 새 액티비티가 열려버리는거라 네비게이션바에서 선택한 아이템?정보가 넘어가질 않았음.
SearchActivity에서의 네비게이션바는 Search가 선택되어있어야하는데 Home이 선택되어있는 불쾌한 경험을 하게되어버림 ㅋㅋ
그래서 그냥 무식하게 처음선택되어있는 아이템을 정해주는걸로 해결함
navigateBar.selectedItemId = R.id.search
이렇게 네비게이션바의 selectedItemId 를 지정해주면 된당~
Glide를 사용해서 넣을 수 있음
build.gradle.kts(Module:app) 파일의 dependencies 부분에 라이브러리 추가해주고 싱크 해준다.
dependencies {
implementation ("com.github.bumptech.glide:glide:4.11.0")
annotationProcessor ("com.github.bumptech.glide:compiler:4.11.0")
.
그 외 라이브러리들...
.
}
res/raw 폴더 생성해서 적용할 gif 파일을 넣어준다.
해당 액티비티의 코틀린 파일에서 글라이드를 통해서 넣어준다!
var gif1 = findViewById<ImageView>(R.id.iv_gif_genre_exploration1)
gif1.clipToOutline = true
Glide.with(this).load(R.raw.citypop).into(gif1)
스포티파이 앱의 검색 탭을 스크롤해보면 검색탭이 스크롤되다가 화면 천장에 닿으면 그때부터는 스크롤되지않고 천장에 붙어있게 된다.
찾아보니 Sticky View , Sticky Scroll 등으로 부르는 것 같고, 뭐 외부라이브러리를 사용해서 구현할 수도 있다고 하는데 최대한 외부라이브러리를 안쓰고 하고 싶었음
scrollView와 sticky Header(위에 붙어있을 애) 만 있으면 그나마 편했을 것 같은데 나는 sticky Header 위에 또 다른 애가 하나 들어가있어서 걔는 그냥 그대로 위로 사라지고, sticky Header만 붙어있어야해서 좀 어지러웠다.
그리고 원래는 그냥 두개 다 스크롤 뷰에서 빼놔서 그것도 다시 수정해야했음 ㅎㅎ 귀찮아~~슈발
‘아무튼 그래서 결국 스크롤뷰에 top contents 랑 검색창을 넣어준다음에,
scrollView = findViewById(R.id.scroll_search_page2)
stickyHeader = findViewById(R.id.layout_search_tab)
topContents = findViewById(R.id.layout_top_contents)
scrollView.viewTreeObserver.addOnScrollChangedListener {
val scrollY = scrollView.scrollY
val topContentBottom = topContents.bottom
if(scrollY > topContentBottom) {
stickyHeader.translationY = (scrollY - topContentBottom).toFloat()
} else{
stickyHeader.translationY = 0f
}
}
이렇게 scrollView, 검색창, 위에 검색하기 등이 있는 부분을 각각 변수에 넣어줬음
viewTreeObserver 는 View가 화면에 그려진 뒤의 정보를 가지고 올 수 있게 해주는 역할임
addOnScrollChangedListener는 스크롤상태의 변경시의 정보를 가지고온다는 뜻
viewTreeObserver없이 높이를 가지고오면 뷰가 그려지기 전의 높이를 가져오게돼서 소용이 없다고함! 저렇게하면 스크롤됐을때의 해당 뷰의 높이를 구해올 수 있다..
그래서 스크롤뷰의 움직인 값을 scrollY로 설정해주고,
topContent의 아래의 값? 도 받아오게 해준다음에,
만약에 스크롤 움직인 값이 topContent의 Bottom보다 클때 검색창의 세로 이동을 고정시키게 해줬음.
양심고백하자면 식을 직접 짜려고 노력했으나 어떻게해야 내가 원하는 곳에 멈추게 하는지 알수가없어서 검색창이 스크롤되다가 멈추긴하는데 존나 엉뚱한데에 멈춰서버리는 불쾌한 경험을 견디지못하고.. 찾아갈 튜터님도 없어버려서 그냥 지피티한테 식 짜달라고 해버림…ㅜ.ㅜ 죄송합니다 죄송합니다 죄송합니다 너무 화나서 참을수가없엇어요.. 오늘은 주말이라 튜터님이 없자나여..ㅜ.ㅜ
를 하려고 열심히 도전했는데 실패함~!
암시적인텐트 처음써보는거기도한데
카메라를 열려면 Manifest에서 권한 설정도 해줘야하고,
찍은 사진으로 어떤 액션을 취하려면 registerForActivityResult로 따로 설정도해줘야하는데 ㅈㄴ복잡해서 머리터질거같은데 꾹참고 블로그 글 보면서 따라해봤는데
다 되고 테스트해봤는데
카메라 버튼누르면 뭐 암시적인텐트 된거마냥 다른 앱 열겠냐는 창 떠서 와 성공? 했는데
에뮬레이터라서 그런가 이동안되고, 그 이후로 다시 재시작해서 카메라버튼눌러도 아무반응이없어버려서
열받아서 걍 싹 지워버림
그리고 그냥 암시적인텐트 카메라로 안하고 머 유투브 열기 그런거로 하기로 노선 변경함
주제 파악 잘해버리기~!
네비바 누르면 화면 이동하고, 검색탭의 gif랑 스티키 뷰가 잘 구현되어있는 모씁~~