[Instagram 클론 코딩] 홈페이지 만들기 (1)

mi-fasol·2023년 1월 18일
0

Instagram

목록 보기
2/4

오늘은 저번에 얘기했던대로 홈 페이지 구현을 가져왔다.

사실 코드를 깔끔하고 안정적으로 작성하지 못하는 편이라 아직 내 코드를 보여주는 게 부끄럽지만, 내 코드의 지저분함을 알아볼 정도의 사람이면 어련히 걸러 보겠거니 하고 오늘도 적어본다.

혹시 이 글을 보시는 분들 중에 부족한 부분을 발견하시고 댓글을 남겨주시는 건 언제나 환영입니다

이번 게시물의 핵심 주제가 될 RecyclerView의 디자인 화면이다.

왜냐면 이 리사이클러뷰를 활용해서

이렇게까지 만드는 게 이번 주제기 때문이다.

로딩 화면에서 넘어가는 홈 페이지를 구현한 건데, 추후에 기능을 완성하고 마지막으로 디자인을 다듬을 예정이니 바텀 네비게이션 아이콘 사이즈가 안 맞는다든가 하는 사소한 문제는 그냥 넘겨주시기를 바란다.

구현 이미지를 보면 알겠지만 홈 액티비티는 크게 앱 바, 프레그먼트, 네비게이션으로 구성되어 있다.

HomeActivity에 바텀 네비게이션을 구현하고, 다섯 개의 프레그먼트 사이에서 네비게이션이 동작한다.

// HomeActivity.kt

class HomeActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_home)

        var bottomNav = findViewById<BottomNavigationView>(R.id.bnv_main)

        bottomNav.run {
            setOnNavigationItemSelectedListener {
                when (it.itemId) {
                    R.id.nav_home -> {
                        val homeFragment = HomeFragment()
                        supportFragmentManager.beginTransaction()
                            .replace(R.id.fl_container, homeFragment).commit()
                    }
                    R.id.nav_search -> {
                        val searchFragment = SearchFragment()
                        supportFragmentManager.beginTransaction()
                            .replace(R.id.fl_container, searchFragment).commit()
                    }
                    R.id.nav_video -> {
                        val videoFragment = VideoFragment()
                        supportFragmentManager.beginTransaction()
                            .replace(R.id.fl_container, videoFragment).commit()
                    }
                    R.id.nav_shopping -> {
                        val shoppingFragment = ShoppingFragment()
                        supportFragmentManager.beginTransaction()
                            .replace(R.id.fl_container, shoppingFragment).commit()
                    }
                    else -> {
                        val myPageFragment = MyPageFragment()
                        supportFragmentManager.beginTransaction()
                            .replace(R.id.fl_container, myPageFragment).commit()
                    }
                }
                true
            }
            selectedItemId = R.id.nav_home
        }
    }
}

HomeActivity를 위와 같이 각각 프래그먼트로 이동할 수 있는 바텀 네비게이션 바 코드를 작성했다.

바텀 네비게이션을 만드는 코드는 검색하면 꽤 많이 나오니, 굳이 해당 게시물에서까지 보여줄 필요는 없을 것 같다 판단하고 설명으로 넘어가겠다.

위에서 보이는 when 구문은 다른 언어의 switch-case문이라고 보면 될 것 같다.

when(id){
	1 -> {
    	// id가 1일 때의 동작
    }
    2 -> {
    	// id가 2일 때의 동작
    }
    ...
    else {
    	// 위의 조건에 모두 해당되지 않을 때의 동작
    }
}

추가적인 이해를 돕기 위한 간략한 코드.

또한 selectedItemId = R.id.nav_home으로 기본 위치를 HomeFragment로 설정했다.

이제 프래그먼트로 넘어가보자.

화질이 좀 안 좋지만 fragment_home.kt의 디자인 화면이다.

공통적으로 사용되는 앱 바 하나가 있는 게 아니라 각 페이지별로 헤더가 달라져서, 각 xml 파일 안에 간단하게 구현하는 방식을 선택했다.
뭔가 비효율적인 것 같아도 어쩔 수 없다.


앱 바는 이렇게 ImageView 한 개와 세 개의 버튼으로 구성되어 있다.

코틀린이 기본 제공하는 Button 태그를 사용하려 했었는데 디자인이 너무 별로라서 깔끔하게 아이콘만 보여줄 수 있도록 작성했다.

혹시 이미지 버튼을 사용하고 싶은데 기본 Button에 작성하자니 뭔가 좀 이상하다 싶으신 분들은 아래 코드를 따라서 작성하시면 된다.

<androidx.appcompat.widget.AppCompatButton		// 여기
      android:id="@+id/addPost"
      android:layout_width="30dp"
      android:layout_height="30dp"
      android:layout_marginRight="25dp"
      android:background="@drawable/ic_plus" />

버튼에 넣을 이미지는 android:background 속성에 부여하면 된다.

홈 프레그먼트의 구성 요소는 게시물을 보여줄 RecyclerView와 앱 바가 전부인데, RecyclerView까지 다루기엔 글이 너무 길어질 것 같아서 다음 게시물에 이어서 작성하겠다.

현재는 전체적인 레이아웃과 간단한 동작만 정의되어 있고 DB가 연결되진 않아서 휘뚜루 마뚜루 코드를 작성했는데 MVVM 패턴도 제대로 사용하고, 바인딩도 사용해야 한다.

언제 다 갈아엎지 생각하니까 좀 막막하지만 꾸준히 해나가면 언젠가 완성되겠지라는 마음으로 열심히 해봐야겠다.

profile
정위블

0개의 댓글