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를 사용하면 된다.

'Development > Kotlin&Android' 카테고리의 다른 글

코루틴, 서비스, 권한  (0) 2023.05.30
안드로이드 데이터 저장 방식  (0) 2023.05.18
프래그먼트(Fragment)  (0) 2023.04.29
액티비티와 인텐트  (0) 2023.04.13
안드로이드-레이아웃  (0) 2023.03.30

+ Recent posts