안드로이드 개발자의 창고
[41일차 Android] Fragment에서의 ToolBar 사용 본문
출처 : 안드로이드 앱스쿨 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 |