본문 바로가기

~2023

[Android] Context Menu의 두 가지 모드 - Floating, Action

728x90
반응형

<실행 예시>

 

컨텍스트 메뉴 플로팅 방식
컨텍스트 메뉴 액션 모드

 


<풀이>

 

Context Menu는 두 가지 방법으로 구현할 수 있는데 플로팅(Floating) 방식과 액션(Action) 방식이 있다.

Context Menu는 Long 클릭 시 개별 뷰를 동작시키거나 갤러리와 이메일 앱처럼 평소에는 보이지 않다가 Long 클릭 시 여러 개의 체크 박스가 나오면서 선택할 수 있게 하기 위해 사용된다.

그래서 플로팅 방식은 Long 클릭 시 메뉴바를 기준으로 Context Menu가 생성되고 액션 방식은 Long 클릭 시 액션바(상단바)에 Context Menu가 생성된다.

 

Floating Mode

플로팅 방식은 옵션 메뉴에서 구현했던 방법과 유사해서 간단하다. 이벤트 리스터 부분이 거의 비슷해 메소드명만 다르고 onCreateContextMenu()에서 여러 뷰가 적용될 수 있기 때문에 View의 객체인 v를 이용해 현재 보고 있는 리소스 아이디를 가져와 inflater 객체를 만들어준다.

플로팅 방식은 구현 후에 Activity에 적용하기 위해서 registerForContextMenu()를 통해 View에 Context Menu를 등록해야 한다.

공통적으로 Context Menu를 활성화 하기 위해 Button과 TextView를 이용했다. (xml 코드는 맨 아래에 있음)

그래서 View 객체를 만들어준다. 앞서 Floating Mode를 적용시키기 위해서 registerForContextMenu()의 매개변수로 View 객체를 넘겨줘야 한다.

ContextMenu는 여러 View에서 작동될 수 있기 때문에 View v로 어떤 View로 호출되었는지 확인하기 위해 switch을 통해 리소스 아이디를 찾는다. 그런 다음 inflate()에 (리소스 아이디, menu)를 전달해주면 알맞는 ContextMenu가 활성화된다.

Floating은 클릭 이벤트 리스너인 onContextItemSelected가 옵션 메뉴의 클릭 이벤트 리스너와 비슷하게 구현된다. 이벤트 리스너의 매개변수인 item으로 알맞는 item 객체를 switch로 찾아내 기능에 맞는 실행문을 작성해주면 된다.

 

Action Mode

액션 모드는 콜백 메소드가 필요하기 때문에 ActionMode 클래스를 이용해야 한다. 리소스에서 id로 찾은 View 객채에 LongClick 리스너를 추가하고 ActionMode 객체가 null이면 Ation Mode를 ON 상태로 변경한다. Action Mode를 작동시키기 위해서는 콜백 메소드가 구현된 객체의 데이터를 받아야 하기 때문에 콜백 메소드가 필요하다.

ActionMode.Callback 객체에서 onCreateActionMode()는 inflater 객체를 생성하고 onPrepareActionMode()에서는 상태가 업데이트 되면 실행할 동작문을 작성하며, onActionItemClicked()는 클릭 이벤트 리스너를 구현한다. 마지막으로 onDestoryActionMode()는 Action Mode가 종료될 때 실행할 작동문을 구현한다.

ActionMode는 콜백 메소드 객체로 활성화시키기 때문에 onLongClickListener()를 통해 LongClick 시 mActionMode가 null이 아니라면 MainActivity에서 Action Mode를 활성화시킨다.

onCreateActionMode()는 상태 활성화 시 처리 메소드인데 inflater를 만들어 inflate()에 활성화 할 Context Menu 리소스 아이디와 menu를 넘겨주면 액션바에 Context Menu가 활성화된다. 그리고 onActionItemClicked()로 Context Menu가 클릭되면 클릭된 item을 찾아 알맞게 작동된다.

 


<xml>

Button Long 클릭 시 생성되는 Context Menu
TextView Long 클릭 시 생성되는 Context Menu

 

 

 

 

 

728x90
반응형