바텀 네비게이션과 Fragment 화면 연동

소정·2023년 3월 31일
0

Kotlin

목록 보기
12/27

메인.xml

Fragment를 가진 메인 xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".main.MainActivity">

    <FrameLayout
        android:id="@+id/fragment_warp"
        android:layout_weight="1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

    <com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/bnav"
        app:menu="@menu/bottom_menu"
        app:itemTextColor="@color/bnv_item_color"
        app:itemIconTint="@color/bnv_item_color"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    </com.google.android.material.bottomnavigation.BottomNavigationView>

</LinearLayout>



mainActivity.kt

  • supportFragmentManager 를 통해서 프래그먼트를 얻어온다

  • 첫 화면은 add로 가져옴

  • 바텀 네비를 setOnItemSelectedListener 를 통해서 클릭 시 반응하도록 함
    itemId 를 통해 분기처리함 navmenu 만들때 쓴 id로 분기처리

  • 버튼을 눌렀을 때 화면이 바뀌는 것은
    replce를 쓴다

package com.jscompany.neerbyto.main

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.google.android.material.bottomnavigation.BottomNavigationView
import com.jscompany.neerbyto.R
import com.jscompany.neerbyto.chat.MainChatFragment
import com.jscompany.neerbyto.databinding.ActivityMainBinding
import com.jscompany.neerbyto.profile.MainMyZoneFragment
import com.jscompany.neerbyto.trede.MainTredeFragment

class MainActivity : AppCompatActivity() {

    private val binding:ActivityMainBinding by lazy { ActivityMainBinding.inflate(layoutInflater) }

    //바텀네비
    private val bottomnavi:BottomNavigationView by lazy { binding.bnav }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(binding.root)

        //맨 처음 보여줄 플래그먼트 데려오기
        supportFragmentManager.beginTransaction().add(R.id.fragment_warp, MainTredeFragment()).commit()

        //바텀 네비게이션에 연동
        bottomnavi.setOnItemSelectedListener {
            if(it.itemId == R.id.bnv_home) supportFragmentManager.beginTransaction().replace(R.id.fragment_warp, MainTredeFragment()).commit()
            else if(it.itemId == R.id.bnv_chat) supportFragmentManager.beginTransaction().replace(R.id.fragment_warp, MainChatFragment()).commit()
            else if(it.itemId == R.id.bnv_myzone) supportFragmentManager.beginTransaction().replace(R.id.fragment_warp, MainMyZoneFragment()).commit()

            return@setOnItemSelectedListener true
        }
        
    }
}



중복코드 함수로 변경

package com.jscompany.neerbyto.main

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.fragment.app.Fragment
import com.google.android.material.bottomnavigation.BottomNavigationView
import com.jscompany.neerbyto.R
import com.jscompany.neerbyto.chat.MainChatFragment
import com.jscompany.neerbyto.databinding.ActivityMainBinding
import com.jscompany.neerbyto.profile.MainMyZoneFragment
import com.jscompany.neerbyto.trede.MainTredeFragment

class MainActivity : AppCompatActivity() {

    private val binding:ActivityMainBinding by lazy { ActivityMainBinding.inflate(layoutInflater) }

    //바텀네비
    private val bottomnavi:BottomNavigationView by lazy { binding.bnav }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(binding.root)

        //맨 처음 보여줄 플래그먼트 데려오기
        supportFragmentManager.beginTransaction().add(R.id.fragment_warp, MainTredeFragment()).commit()

        //바텀 네비게이션에 연동
        bottomnavi.setOnItemSelectedListener {
            changeFragment(it.itemId)
            true
        }

        // 첫 화면
        changeFragment(R.id.bnv_home)
        
    }

    //플래그먼트 변경 함수
    private fun changeFragment(menuItemId:Int){
        val targetFragment = getFragment(menuItemId)
        supportFragmentManager.beginTransaction().replace(R.id.fragment_warp, targetFragment).commit()
    }

    // 플래그먼트 화면 반환 함수
    private fun getFragment(menuItemId: Int) : Fragment {
        val fragment = when (menuItemId) {
            R.id.bnv_home -> MainTredeFragment()
            R.id.bnv_chat -> MainChatFragment()
            R.id.bnv_myzone -> MainMyZoneFragment()
            else -> throw IllegalArgumentException("not found menu item id")
        }
        return fragment
    }

}
profile
보조기억장치

0개의 댓글