Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 한달어스
- 아비투스
- 끝말잇기
- 자취필수템
- 목적 중심 리더십
- 좌식테이블
- 어떻게 나답게 살 것인가
- 브런치작가되기
- 프래그먼트
- 리얼하다
- 북한살둘레길
- 베드트레이
- 안드로이드
- 함수형 프로그래밍
- 테트리스
- T자형인재
- 슬기로운 온라인 게임
- 소프시스
- 면접
- 지지않는다는말
- 커스텀린트
- 목적중심리더십
- 한단어의힘
- 재택근무
- 한달브런치북만들기
- 베드테이블
- 1일1커밋
- 한달독서
- 캐치마인드
- 소프시스 밤부 좌식 엑슬 테이블
Archives
- Today
- Total
정상에서 IT를 외치다
[Android] Customing BottomNavView 본문
반응형
안녕하세요. 블랙진입니다.
ViewPager2에서 사용할 수 있는 초 간단한 CustomBottomNavView 예제 코드입니다.
0. CustomView 생성
- @JvmOverloads 를 추가하면 코틀린 컴파일러가 자동으로 오버로딩한 자바 메소드를 추가 해준다.
- xml 상에서 자식 뷰를 생성했을 때 자식 뷰 만큼 네비게이션이 만들어 집니다.
- 자식뷰에서 설정한 style의 isSelected 여부에 따라 네비게이션의 뷰가 변경됩니다.
class BottomNavView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : LinearLayout(context, attrs, defStyleAttr) {
private val items = hashMapOf<Int, View>()
fun setViewPager(pager: ViewPager2) {
pager.adapter?.let { adapter ->
if (childCount == adapter.itemCount) {
for (i in 0 until childCount) {
items[i] = getChildAt(i).apply {
setOnClickListener {
pager.currentItem = i
}
}
}
} else {
error("child view not match the viewpager view count")
}
} ?: error("adapter is null")
pager.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
override fun onPageSelected(position: Int) {
super.onPageSelected(position)
for ((k, v) in items) {
v.isSelected = k == position
}
}
})
}
}
<사용법>
1. Xml에 적용
- BottomNavView의 자식 뷰 갯수 만큼 네비게이션을 만들어 줍니다.
- isSelected에 따라 포커싱 되었을 때 View가 변경됩니다.
<com.tistory.blackjin.myinatagram.customview.BottomNavView
android:id="@+id/llBottomNav"
android:layout_width="0dp"
android:layout_height="50dp"
android:orientation="horizontal"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent">
<TextView
style="@style/TextInstagramBottomNav"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center"
android:text="라이브러리" />
<TextView
style="@style/TextInstagramBottomNav"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center"
android:text="사진찍기" />
</com.tistory.blackjin.myinatagram.customview.BottomNavView>
2. TextVIew의 Style을 선언해 줍니다.
<style name="TextInstagramBottomNav" parent="@android:style/Widget.TextView">
<item name="android:textSize">17sp</item>
<item name="android:textStyle">bold</item>
<item name="android:textColor">@color/white</item>
<item name="android:background">@drawable/selector_text_bottom_nav</item>
</style>
3. selector_text_bottom_nav 생성
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="#0091ff" android:state_selected="true" />
<item android:drawable="#3c3c3c" />
</selector>
4. CustomBottomNav에 ViewPager2를 연결해주면 끝!
binding.llBottomNav.setViewPager(binding.vpInstagram)
반응형
'안드로이드' 카테고리의 다른 글
카메라 예제와 함께 보는 Scoped Storage (안드로이드 Q 대응) (1) | 2020.01.13 |
---|---|
카메라 예제와 함께 보는 Scoped Storage (이미지 가져오기) (0) | 2020.01.13 |
[Android, BottomSheet] 안드로이드 버텀 시트 사용 (0) | 2019.11.24 |
카메라 예제와 함께 보는 Scoped Storage (저장소의 종류) (6) | 2019.11.15 |
카메라 예제와 함께 보는 Scoped Storage (권한 가져오기) (0) | 2019.11.15 |
Comments