NOW OR NEVER

[Android] Menu & Activity 본문

Android

[Android] Menu & Activity

LAURA 2023. 6. 16. 17:48
반응형

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 생성 : 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
Comments