반응형
Notice
Recent Posts
Recent Comments
Link
NOW OR NEVER
[Android] Menu & Activity 본문
반응형
Menu
- menu 파일 생성 방법 : Files - new - Android Resource File
option Menu
- Activity Bar
- res - values - themes 더블 클릭 - Base application theme. : 어플 화면 테마 조정 가능(noActionBar 만 지워서 설정 바꾸기)
- 액션 바 잘 사용하지 않고 툴바 많이 이용
- activity 당 하나 설정 가능
- menu 구성 방법
- xml : 프로그램 실행 중에 메뉴 변동성 없을 경우 해당 파일로 수정(new Menu Resource File)
- 코드 : 프로그램 실행 중에 메뉴 변동성 있을 경우 코드로 수정
- 메뉴를 배치하고 메뉴 아이템으로 메뉴 구성
- icon 사용 못함
Main Activity에서의 메뉴 구성
onCreateOptionsMenu
- 옵션 메뉴를 구성하기 위해 사용하는 메서드
- xml 파일로 부터 메뉴를 생성: menuInflater.inflate(R.menu.main_menu, menu)
- 코드를 통한 메뉴 구성(menuInflater 대신) : menu?.add()
- true 반환 시 메뉴 나타남
override fun onCreateOptionsMenu(menu: Menu?): Boolean { menuInflater.inflate(R.menu.main_menu, menu) return true }
onOptionsItemSelected
- 매개변수로 사용자가 선택한 메뉴 항목 객체가 들어온다.
- 메뉴 항목의 id로 분기한다.
override fun onOptionsItemSelected(item: MenuItem): Boolean { activityMainBinding.run{ when(item.itemId){ R.id.menu_item1 -> textView.text = "메뉴 항목1을 선택했습니다" R.id.menu_item2 -> textView.text = "메뉴 항목2를 선택했습니다" R.id.menu_item31 -> textView.text = "하위 메뉴 3-1을 선택했습니다" R.id.menu_item32 -> textView.text = "하위 메뉴 3-2를 선택했습니다" R.id.menu_item4 -> textView.text = "메뉴 항목4를 선택했습니다" } } return super.onOptionsItemSelected(item) }
pop up menu
- 원할 때 원하는 곳에서 팝업으로 메뉴 띄울 수 있음
- PopupMenu(this@MainActivity, 원하는 곳)
- 리스너
- setOnMenuItemClickListener : 팝업메뉴를 눌렀을 때 동작하는 리스너
context menu
- 안드로이드에 가장 많이 사용하는 메뉴
- 특정 뷰를 길게 누르면 메뉴 나타남
- registerForContextMenu(view id) : 컨텍스트 뷰를 등록하고 싶은 모든 뷰마다 해당 메서드를 설정해줘야 함(recycler view는 해당 메서드로 컨텍스트 설정 안함)
- 사용자가 선택한 길게 누른 뷰가 무엇인지 알 수 없으므로 서로 다른 뷰의 컨텍스트 메뉴라도 메뉴 id를 다 다르게 줘야 한다.
- listView에서의 메뉴 구성 시 몇 번째(position) 항목을 길게 눌렀는 지 그 몇 번째 항목의 몇 번째 메뉴를 눌렀는 지 구분하는 것이 중요하다.
- recycler view에서 적용 법
- setOnCreateContextMenuListener{menu,v,menuInfo -> 실행문}
// 항목 하나의 View에 컨텍스트 메뉴 생성 이벤트를 붙혀준다. rowBinding.root.setOnCreateContextMenuListener { menu, v, menuInfo -> menu.setHeaderTitle("${dataList[adapterPosition].name}") menuInflater.inflate(R.menu.row_menu, menu) // 첫 번째 메뉴에 대한 이벤트 처리 menu[0].setOnMenuItemClickListener { // 현재 항목 번째를 삭제한다. dataList.removeAt(adapterPosition) this@RecyclerViewAdpaterClass.notifyDataSetChanged() false // 반환 값이 의미가 없다. } }
- viewHolderClass 는 recylcle view 항목 하나당 생성된다. 그래서 viewHolderClass에서 컨텍스트 메뉴 생성 이벤트(위 메서드)를 만든다
Activity
- 안드로이드 4대 구성요소
- Activity
- 화면이 있는 실행 단위(화면이 보여서 눈에 보이는 화면을 관리하는 것이 중요)
- 눈에 보이는 화면 하나를 관리하는 요소
- 화면 여러 개면 여러 activity
- 각각이 독립적이다. 하나의 독립적인 실행 단위이다. (하나를 실행하면 다른 하나를 실행해야 한다, 다른 activity의 변수 등을 사용할 수 있다 등이 없음)
- 같은 어플리케이션 내부에 존재하는 activity들끼리 실행이 자유롭다. 다른 어플리케이션에 있는 activity를 실행하는 것은 자유롭지 않다. 하지만 어플을 만들 때 다른 어플리케이션에서 activity 사용할 수 있게 만들면 다른 어플리케이션에서도 activity 실행 가능
- Service
- 화면이 없는 실행 단위
- background processing이라 불린다. 하지만 지금 안드로이드에서는 이거다 라고 말하기 어려움
- Activity
- 새로운 Activity 생성 : new - Activity
생명 주기
activity 실행 과정
- onCreate -> onStart -> onResume
- onResume, onPause, onCreate, onDestroy 중요
- onCreate
- 액티비티가 처음 실행 될 때 자동으로 호출된다.
- 액티비티가 관리할 View들을 생성하고 View들에 대한 초기작을 수행한다.
- 화면 회전이 발생 했을 때의 처리도 수행한다.
- onStart
- 액티비티가 처음 생성될 때 onCreate 다음으로 호출된다.
- activity가 보이지 않는 상태가 되었다가 다시 보이게 될 때 onRestart 다음에 호출된다
- onResume
- activity가 다시 가동될 때(눈에 보일 때) 그전에 무조건 호출되는 메서드
- onPause
- 다른 activity 화면이 보일 때 activity 일시정지
- 어떠한 상황이던간에 activity가 사라질 때(눈에 안보이는 상태) 그 전에 무조건 호출되는 메서드
- 화면 실행되다가 메세지 등이 뜨는 상황이 발생해서 화면이 가려지면 onPause() 호출
- 다른 액티비티가 눈에 보여질 때 호출 현재 액티비티는 일시 정지된다.
- onStop
- 다른 액티비티가 실행 됐거나 홈으로 나가거나 등 일땐 onStop() 호출
- 현재 액티비티의 화면이 완전히 보이지 않게 될 때 onPause 다음에 호출된다.
- onRestart
- onStop이 호출된 이후 다시 액티비티가 보여지는 상태가 될 때 호출된다.
- onDestory
- 해당 액티비티가 소멸될 때 onDestroy()
- 액티비티가 완전 종료될 때 호출
- 메모리 상에서 완전히 소멸
back stack
- 안드로이드에서 중요한 개념
- 안드로이드는 이전, 앞으로 간다는 개념이 없음 그래서 back stack이라는 공간이 존재
- activity는 무조건 back stack에 담긴다.(stack구조로 쌓인다. activity 위에 activity)
- a activity에서 b activity로 이동하는 것이 아닌 A라는 activity가 b라는 activity를 실행시키는 것
- back button
- 이전으로 돌아간다는 개념이 아니다.
- 안드로이드 뒤로 가기(이전으로 돌아가기) 버튼이 존재하지 않는다. back 버튼은 이전으로 돌아가는 것처럼 보이지만 사실은 그 버튼의 동작은 좀 다르다.
- activity가 실행되면 back stack이 쌓이는 개념이라 back 버튼을 누르게 되면 finish라는 메서드가 동작되어 가장 위에 쌓인 stack을 사라지게 만드는 것이다.(즉, 안드로이드에서의 back 버튼은 현재 보이는 activity를 종료하는 것이다. )
- finish() : 현재 Activity를 종료하고 BackStack에서 제거한다
- 사용자의 조작에 의해서 a->b->c->d stack으로 쌓였을 때 d->a 로 갈때 cb를 제거해줘야 한다.
- 네비게이션 표준 기준에 어긋나는 행동이므로 back stack의 순서를 바꾸는 작업은 하지 않는다.
Intent
- 안드로이드 4대 구성 요소를 실행하기 위해서 필요
- 개발자가 직접 가동하는 것이 아닌 intent에 activity 실행하기 위한 정보를 담기만 하고 android os가 가동이 가능한 것인지 판단하고 가동이 되면 가동하고 안되면 에러를 발생한다.
- activity 실행 중 다른 activity 실행 시 intent 객체 만들어야 한다.
- intent 객체 지정 시 자바 클래스를 지정해줘야 하기 때문에 kotlin 기반 activity를 자바로 변환 시켜 지정해야 한다.
- Intent(this@실행되고있는 activity이름, 실행시킬 activity이름::class.java)
etc
- 기본적으로 emulator은 화면 회전 잠겨있어서 위에서 아래로 끌어내려서 메뉴 설정에 가서 자동회전 끔을 켜짐을 바꿔줘야 한다.
'Android' 카테고리의 다른 글
[Android] 다른 앱에서의 activity 사용 & Android Message (0) | 2023.06.22 |
---|---|
[Android] Parcelable (0) | 2023.06.19 |
[Android] 권한 (0) | 2023.06.15 |
[Android] View3 - Adapter (0) | 2023.06.14 |
[Android] UI 요소 - View 2 (0) | 2023.06.14 |