Archives
Recent Posts
«   2025/02   »
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
Today
Total
관리 메뉴

안드로이드 개발자의 창고

[41일차 Android] Fragment에서의 ToolBar 사용 본문

Computer/Android

[41일차 Android] Fragment에서의 ToolBar 사용

Wise-99 2023. 7. 1. 21:34

 

 

 

출처 : 안드로이드 앱스쿨 2기 윤재성 강사님 수업 PPT

 

 

 

📖 Fragment에서의 ToolBar 사용

  • Fragment에서 Toolbar를 사용하는 방법은 Activity에서 Toolbar를 설정하는 방법과 유사하다.
  • Toolbar가 가지고 있는 다양한 기능들도 모두 사용할 수 있다.

 

 

 

예제 코드

menu/main_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:id="@+id/mainMenuAdd"
        android:icon="@android:drawable/ic_menu_add"
        android:title="추가"
        app:showAsAction="always" />
</menu>

 

 

 

MainActivity.kt

class MainActivity : AppCompatActivity() {

    lateinit var activityMainBinding: ActivityMainBinding

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

        activityMainBinding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(activityMainBinding.root)

        replaceFragment(FragmentName.FRAGMENT_MAIN, false, false)
    }

    // 지정한 Fragment를 보여주는 메서드
    fun replaceFragment(name:FragmentName, addToBackStack:Boolean, animate:Boolean){
        // Fragment 교체 상태로 설정
        val fragmentTransaction = supportFragmentManager.beginTransaction()
        // 새로운 Fragment를 담을 변수
        var newFragment: Fragment? = null

        // 이름으로 분기
        when(name){
            FragmentName.FRAGMENT_MAIN -> {
                newFragment = MainFragment()
            }
            FragmentName.FRAGMENT_INPUT -> {
                newFragment = InputFragment()
            }
        }

        if(newFragment != null) {
            // Fragment를 교체
            fragmentTransaction.replace(R.id.mainContainer, newFragment)

            if (animate == true) {
                // 애니메이션 설정
                fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
            }

            if (addToBackStack == true) {
                // Fragment를 Backstack에 삽입
                fragmentTransaction.addToBackStack(name.str)
            }

            // 교체 명령
            fragmentTransaction.commit()
        }
    }

    // Fragment를 BackStack에서 제거
    fun removeFragment(name:FragmentName){
        supportFragmentManager.popBackStack(name.str, FragmentManager.POP_BACK_STACK_INCLUSIVE)
    }
}

enum class FragmentName(var str:String){
    FRAGMENT_MAIN("MainFragment"),
    FRAGMENT_INPUT("InputFragment"),
}

 

 

 

MainFragment.kt

class MainFragment : Fragment() {

    lateinit var fragmentMainBinding: FragmentMainBinding
    lateinit var mainActivity: MainActivity

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        mainActivity = activity as MainActivity
        fragmentMainBinding = FragmentMainBinding.inflate(layoutInflater)

        fragmentMainBinding.run {
            toolbarMain.run {
                // 제목 설정
                title = "정보 입력"
                // 제목 색상 설정
                setTitleTextColor(Color.WHITE)
                
                inflateMenu(R.menu.main_menu)
                
                // 메뉴 클릭 시 InputFragment 이동
                setOnMenuItemClickListener {
                    mainActivity.replaceFragment(FragmentName.FRAGMENT_INPUT, true, true)
                    false
                }
            }
        }

        return fragmentMainBinding.root
    }
}

 

 

 

InputFragment.kt

class InputFragment : Fragment() {

    lateinit var fragmentInputBinding: FragmentInputBinding
    lateinit var mainActivity: MainActivity

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        mainActivity = activity as MainActivity
        fragmentInputBinding = FragmentInputBinding.inflate(layoutInflater)

        fragmentInputBinding.run {
            toolbarInput.run {
                // 제목 설정(변경)
                title = "정보 입력"
                // 제목 색상 설정
                setTitleTextColor(Color.WHITE)
                // Back버튼 설정
                setNavigationIcon(androidx.appcompat.R.drawable.abc_ic_ab_back_material)
                // 아이콘의 색상 설정
                if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q){
                    navigationIcon?.colorFilter = BlendModeColorFilter(Color.WHITE, BlendMode.SRC_ATOP)
                } else {
                    navigationIcon?.setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_ATOP)
                }
                
                // Back버튼 클릭 시 BackStack에서 제거
                setNavigationOnClickListener {
                    mainActivity.removeFragment(FragmentName.FRAGMENT_INPUT)
                }
            }
        }

        return fragmentInputBinding.root
    }
}

 

 

 

결과

'Computer > Android' 카테고리의 다른 글

[41일차 Android] AppBarLayout  (0) 2023.07.01
[41일차 Android] ViewPager2  (0) 2023.07.01
[41일차 Android] ToolBar  (0) 2023.07.01
[41일차 Android] ActionBar Navigation  (0) 2023.07.01
[41일차 Android] ActionView  (0) 2023.07.01