App Bar (ActionBar)
- 앱의 상단에 표시됨
- 타이틀, 액션아이콘, 옵션 메뉴를 표시
- Toolbar: 레이아웃 내에 한 위젯처럼 취급
- 생성 방법
- AppBarConfiguration 생성
- NavController 와 AppBarConfiguration 연결
- onSupportNavigateUp() 재정의
액션아이콘 메뉴
- App Bar에 타이틀 표시하고 남은 공간에 액션 아이콘과 메뉴 아이템을 배치한다. 공간이 부족할시 오버플로우 메뉴 사용
- 메뉴 작성 방법
- 메뉴 리소스 정의 - menu/파일이름.xml
- android:id 학목 식별자
- android:icon 항목 아이콘
- android:title 항목 텍스트
- app:showAsAction
- alwats: 항상 액션 아이콘 (디폴트 옵션)
- ifRoom 공간이 가능하면
- 액티비티의 onCreateOptionsMenu(): 메뉴 생성
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.main_menu, menu)
// R.menu.main_menu : 리소스 메뉴 파일 이름이 menu/main_menu.xml
return true
}
}
- 액티비티의 onOptionsItemSelected(): 메뉴 선택 처리
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) { // 생략, 앞 슬라이드 참고 }
override fun onCreateOptionsMenu(menu: Menu?): Boolean { // 생략, 앞 슬라이드 참고 }
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
R.id.action_favorite ->
println(“action_favorite 선택”)
R.id.action_settings ->
println(“action_settings 선택”)
R.id.navDrawer ->
startActivity(Intent(this, MainActivityDrawer::class.java))
R.id.navBottom ->
startActivity(Intent(this, MainActivityBottomNav::class.java))
else -> return super.onOptionsItemSelected(item)
}
return true
}
팝업 메뉴
- 안드로이드에서 메뉴 종류
- 옵션 메뉴, 팝업 메뉴
- 컨텍스트 메뉴: 롱클릭시 해당 항목과 관련된 메뉴 표시
- 팝업 메뉴 Jetpack의 androidx.appcompat.widget.PopupMenu
private fun showPopup(v: View) { // v는 팝업 메뉴를 보여줄 뷰, 클릭한 뷰를 보통 사용
PopupMenu(requireContext(), v).apply { // requireContext()는 프래그먼트에서
inflate(R.menu.nav_menu) // 메뉴 리소스로 메뉴 생성
setOnMenuItemClickListener { // 메뉴 선택 처리를 위한 리스너
when (it.itemId) {
R.id.homeFragment -> {
Snackbar.make(v, "HomeFragment", Snackbar.LENGTH_SHORT).show()
true
}
else -> false
}
}
}.show() // 팝업 메뉴 나타나게 함
}
다이얼로그
class OkCancelDialogFragment : DialogFragment() {
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
isCancelable = false // 다이얼로그 외부 클릭시 사라지지 않도록 함
return AlertDialog.Builder(requireActivity()).apply {
setMessage("OK-CANCEL Dialog")
setPositiveButton("OK") { dialog, id -> println("OK")}
setNegativeButton("CANCEL") { dialog, id -> println("CANCEL")}
}.create() // Dialog 객체 생성
}
}
- DialogFragment내에서 생성 클래스
- AlertDialog
- DatePickerDialog, TimePickerDialog
다이얼로그 - DatePickerDialog
class DatePickerFragment : DialogFragment(), DatePickerDialog.OnDateSetListener {
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
return DatePickerDialog(requireContext(), this,
2021, 4, 5) // Jan: 0, Feb:1, Mar:2, Apr: 3, May:4 ...
}
override fun onDateSet(view: DatePicker?, year: Int, month: Int, dayOfMonth: Int) {
println("$year, $month, $dayOfMonth")
}
}
다이얼로그 - 커스텀 다이로그 (바텀 다이얼로그)
class MyBottomSheetDialog : BottomSheetDialogFragment() {
private val myViewModel: MyViewModel by activityViewModels()
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
isCancelable = false
return inflater.inflate(R.layout.my_bottom_dialog, container,false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
view.findViewById<EditText>(R.id.editTextName)?.setText(myViewModel.nameLiveData.value)
view.findViewById<Button>(R.id.buttonOk)?.setOnClickListener {
myViewModel.nameLiveData.value = view.findViewById<EditText>(R.id.editTextName)?.text.toString()
dismiss()
}
}
- 일반 다이올로그는 BottomSheetDialogFragment 대신 DialogFragment를 사용하면 된다.