331일차 - Custom BottomNavgation (1)

2021. 12. 1. 02:44·아카이브/일기
반응형

앞으로 개발할 때, 매 번 바텀 네비게이션을

새로 만들어주는데, 대부분 같은 모양이니

간편하게 쓰기 위해 만들고있다.

 

< BottomNavigationContainer >

package navigation

import android.content.Context
import android.content.res.Resources
import android.util.AttributeSet
import android.view.Gravity
import android.view.View
import android.view.ViewGroup
import android.widget.LinearLayout
import androidx.core.view.children
import com.kwon.mywidgetcollection.R

class BottomNavigationContainer(context: Context?, attrs: AttributeSet?) : LinearLayout(context, attrs) {
    private var nvTextStyles: Int = 0
    private var nvItemSelector: Int = 0
    private var viewList = mutableListOf<View>()
    private val Int.dp: Int get() = (this * Resources.getSystem().displayMetrics.density + 0.5f).toInt()
    var onItemClick: (action: String) -> Unit = { }

    init {
        context?.let { con ->
            attrs?.let { attr ->
                initAttrs(con, attr)
            }
        }
    }

    private fun child() {
        for(v in children) {
            viewList.add(v)
            (v as BottomNavigationItem).layoutParams = LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, 1F)
            v.setTextStyle(nvTextStyles)
            v.setItemSelector(nvItemSelector)
            v.setOnClickListener {
                for(vList in viewList) { v.itemInit((vList as BottomNavigationItem)) }
                if(v.isChecked) v.toggle() else v.toggle()
                onItemClick?.invoke(v.action)
            }
        }
    }

    private fun initAttrs(context: Context, attrs: AttributeSet) {
        orientation = HORIZONTAL
        gravity = Gravity.CENTER
        context.obtainStyledAttributes(attrs, R.styleable.BottomNavigationContainer)?.let { typedArray ->
            setPadding(0, 8.dp, 0, 4.dp)
            nvTextStyles = typedArray.getResourceId(R.styleable.BottomNavigationContainer_nv_text_styles, 0)
            nvItemSelector = typedArray.getResourceId(R.styleable.BottomNavigationContainer_nv_item_selector, 0)
            typedArray.recycle()
        }
    }

    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec)
        child()
    }
}
반응형

'아카이브 > 일기' 카테고리의 다른 글

335일차 - IT 영단어 기획서 V.1.1  (0) 2021.12.05
334일차 - 간단한 일기  (0) 2021.12.04
333일차 - 프레그먼트 화면 전환  (0) 2021.12.03
332일차 - Custom BottomNavigaion (2)  (0) 2021.12.02
330일차 - 구글 클라우드 플랫폼에서 인보이스가 날라왔다  (0) 2021.11.30
329일차 - IT 영단어 기획서 V1.0  (0) 2021.11.29
328일차 - 휴식  (0) 2021.11.22
327일차 - IT 영단어 앱 : 퀴즈  (0) 2021.11.21
'아카이브/일기' 카테고리의 다른 글
  • 333일차 - 프레그먼트 화면 전환
  • 332일차 - Custom BottomNavigaion (2)
  • 330일차 - 구글 클라우드 플랫폼에서 인보이스가 날라왔다
  • 329일차 - IT 영단어 기획서 V1.0
권퓨터
권퓨터
만드는 걸 좋아하는 개발자의 기록. 코드든 글이든, 일단 만들어 봅니다.
  • 권퓨터
    권퓨터: Kwonputer
    권퓨터
  • 티스토리 홈 관리자
  • 전체
    오늘
    어제
    • 분류 전체보기 (559)
      • 개발 (56)
        • 프로젝트 (5)
        • 모바일 (44)
        • 프론트엔드 (0)
        • 백엔드 (2)
        • 인프라 (0)
        • AI · 머신러닝 (4)
      • IT · 테크 (10)
        • 기술 트렌드 (3)
        • 도구 · 생산성 (1)
        • 제품 리뷰 · 추천 (0)
        • 마케팅 · 수익화 (6)
      • 자기계발 (7)
        • 공부법 · 언어 (0)
        • 취업 · 커리어 (7)
      • 아카이브 (486)
        • 일기 (480)
        • 취미 (6)
  • 블로그 메뉴

    • 홈
  • 링크

    • 블로그 이전
  • 공지사항

    • 서브 블로그 => https://kwonputer.com/
  • 인기 글

  • 태그

    next.js
    kotlin
    AI블로그
    riverpod
    OpenAI GPT
    블로그수익화
    TypeScript
    injectable
    다국어 블로그
    Prompt Engineering
    Clean Architecture
    ai 게임 개발
    dynamodb
    python
    flutter
    FACEBOOK광고
    상태관리
    flutter 개발자
    https://www.kwonputer.shop/
    콘텐츠자동화
    python 기초
    AWS CDK
    내러티브 게임
    클린 아키텍처
    파이썬
    Single Table Design
    flutter 면접 질문
    aws lambda
    서버리스 아키텍처
    https://github.com/kwongeneral/kortfolio.git
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
권퓨터
331일차 - Custom BottomNavgation (1)
상단으로

티스토리툴바