Android #6 - Menu (국비32일차)

목차

 

 

(다시 정리 예정...)

 

 

◎ Menu

1. Option Menu
2. Context Menu
3. Popup Menu
4. SearchView
5. ActionView
6. ActionMode

 

 

 

 

 

 

 

etc-image-0

핸드폰 화면에서

시간과 배터리 등이 표시되는 제일 위부분을 

statusBar이라고 한다.

또 그 밑에 메뉴나 검색 버튼 등이 있는 부분을 

ActionBar라고 한다.

오늘은 ActionBar부분을 공부할 예정이다.

 

 

1. Option Menu

blob

메뉴버튼은 흔히

우리가 지금껏 작업했던 Activity가 아니라

위 사진의 '요기'라고 써 있는 부분에 위치한다.

즉 우리는 Activity를 건드리는게 아니다.

 

간단하게 한번 만들어보자.

 

etc-image-2

우선 java파일로 가서

onCreate method 밑에

onCreateOptionMenu method를 만들어주자.

그리고 menu.add를 하면

 

etc-image-3

우상단에 메뉴버튼이 나타나고 눌러보면

etc-image-4

내가 추가한 aa, bb가 나오게 된다.

 

 

 

그럼 이번엔 XML로 작업해보자.

etc-image-5
inflater

그전에 XML에 표기된 레이아웃을

객체화시키는데 도움을 주는 inflater를 알면 좋다.
(앞으로도 많이 사용할 것임)

 

etc-image-6

우선 MenuInflater 객체를 만들자.

이때 new를 사용하는 것이 아니라

getMenuInflater();를 사용한다.

 

etc-image-7

그리고 res폴더에

오른쪽을 눌러서 new Resource Directory를 누른다.

menu 디렉토리가 필요하기 때문이다.

 

etc-image-8

Resource type에서 menu를 찾은 후 ok해주자.

etc-image-9

그리고 그 폴더 안에 option.xml을 만들어주자.

etc-image-10

만든 후 클릭하면 위와 같은 화면이 나타날 것이다.

 

etc-image-11

여기에 이제 아이템을 추가해주자.

item에 필수요소는 title인데 

이를 적지 않으면 에러가 나니 꼭 적어주자.

 

이렇게 따로 xml파일을 만들어주는 이유는

이 영역이 Activity의 영익이 아니기 때문에

거기에서 제어할 수 없어서이다.

그래서 따로 ActionBar을 위한 영역을 만들어주는 것이다.

 

etc-image-12

아이템을 추가하니

이렇게 미리보기가 표시되는 것을 볼 수 있다.

 

etc-image-13

다시 자바로 돌아와서

inflater에게 inflate하라고 코딩하면 된다.

 

etc-image-14

 

그 후 run을 하면

메뉴바가 있고

이를 클릭하면 내가 추가한

item들이 있는 것을 알 수 있다.

 

 

 

 

근데 생각해보면 저 메뉴바말고도 다른 것이

있는 경우가 있다.

etc-image-15

우선 help라는 아이템을 하나 더 추가했다.

그리고 showAsAction이라는 속성을 추가했는데

always는 항상 보여지는 것이며

ifRoom은 공간이 있다면 보여지는 것이고

never는 보여지지 않는 것이다.
(메뉴 아이콘 안으로 들어감)

 

etc-image-16

미리보기 화면으로

search와 add는 ActionBar 영역에 아이콘이 나와있지만

help는 menu 아이콘 안으로 들어가 있는 것을 알 수 있다.

 

etc-image-17

여기서

메뉴 항목 중 어느 것이 클릭되었을 때

발동하는 콜백메소드를 이용하려면

onOptionsItemSelected라는 메소드를 이용하면 된다.

그리고 if문을 통해

각각의 id를 비교해서 발생시킬 기능을 작성하면 된다.

 

 

2. Context Menu

컨텍스트 메뉴는

그 뷰를 꾹 누르면 보여지는 메뉴를 말한다.

etc-image-18

예를 들자면 위와 같은 형태다.

 

etc-image-19

우선 xml에 버튼을 하나 만들어주자.

 

etc-image-20

 

그리고 원래 하던대로

참조변수를 만들고

버튼을 가져와서 리스너를 이용해

버튼을 눌렀을 때 

clicked button toast나오게 코딩했다.

 

etc-image-21

그후 btn객체를 contextMenu로 등록을 했다.

registerForContextMenu 기능을 사용한다.

 

etc-image-22

 

그리고 option menu에서 했던 것처럼

res폴더에서 새로운 menu 디렉토리를 만들어서

context라는 xml파일을 만들고

넣어줄 item까지 작성을 하였다.

 

etc-image-23

design 화면을 보면

이렇게 item들이 만들어진 것을 볼 수 있다.

 

 

etc-image-24

이제 저 버튼을 롱 클릭하면 메뉴가 나타나게 만들어보자.

onCreateContextMenu라는 메소드를 만들고

여기서 inflater 객체를 만들어준다.

그리고 inflater가 inflate를 하게하는데

파라미터엔 아까 만든 context.xml과 
(R 장부에서 찾는 방식으로)

onCraeteContextMenu의 파라미터인 menu를 적어준다.

etc-image-25

그리고 롱 클릭을 해서 뜬 메뉴에서

어떤 것을 눌렀을 때 실행되는 기능 메소드는

onContextItemSelected이다.

option menu에서 한 것처럼 if문을 이용해서

id를 비교하고 내가 실행시킬 코드를 입력시키면 된다.

 

(언제나 느끼지만 기능 이름을 직관적으로 잘 지음..)

 

etc-image-26

그리고 run 시켜서 버튼을 꾹 눌러 나온 메뉴 중

save 버튼을 누르면 위의 화면처럼 Toast가 잘 뜬다.

 

 

 

3. Popup Menu

팝업 메뉴는

버튼을 눌렀을 때 팝업 형식으로 뜨는 방식으로

Context menu와 비슷하지만

팝업이 뜨는 위치를 내가 설정할 수도 있다.

 

etc-image-27

우선 xml로 버튼부터 만들어주자.

 

etc-image-28

그리고 역시 item을 넣기 위해서

menu폴더를 만들고 새로운 xml 파일을 만들어 준 후에

추가할 item들을 추가하자.

 

 

etc-image-29

그리고 자바로 돌아와서

참조변수를 선언하고

뷰들을 넣어주자.

etc-image-30

 

그후 버튼에 리스너를 달아주자.

etc-image-31

그리고 리스너를 통해 선언한 익명클래스 안에서

팝업매뉴 객체를 만들어줘야 한다.
(이때 두번째 파라미터에 어느 것을 쓰냐에 따라 팝업메뉴가
뜨는 위치가 달라짐)

객체를 만든 후

inflater 객체도 만들어주고

inflate를 하게 한 후

popupmenu.show();를 해주면 끝이다.

 

etc-image-32

그리고 만약 선택된 항목에 따라 반응을 시키려면

 setOnMenuItemClicklister을 사용해주자!

 

etc-image-33

그럼 메뉴를 눌렀을 때

텍스트 뷰에 팝업 메뉴가 뜨는 것을 볼 수 있다.

그 이유는 팝업메뉴 객체를 만들 때

두번째 파라미터에 텍스트뷰를 넣었기 때문이다.

 

 

 


4. SearchView

 

SearchView는 클릭하면

검색창이 나타나는 액션바의 일종이다.

etc-image-34
etc-image-35

 

이를 만들기 위해

menu 폴더를 만들고 option이라는 xml파일을 만들자.

etc-image-36

그리고 search라는 item을 만들어주자.

이때 actionViewClass를 androidx로 시작되는

것으로 주어야한다.

 

etc-image-37

자바로 와서

참조변수를 선언하고

 

etc-image-38

onCreateOptionsMenu라는 메소드를 만들어서

getMenuInflater.inflater 를 입력해준다.

그 안에 위에 만든 xml인 option을 넣어주고

 

그 SearchView를 찾아와준다.
(이때 다운캐스팅이 필요...)

 

이때 적용할 수 잇는 설정이 있는데

힌트를 입력하고 싶다면 

setQueryHint를 사용하면 된다

 

만일 글씨변화에 반응하는 리스너를 사용하고 싶다면

setonQuerytextListener를 사용하자.

 

 

 


5. ActionView

 

 

etc-image-39
etc-image-40

액션뷰는

서치뷰에서 한단계 더 나아간 형태로

이미지 아이콘을 추가할 수 있다.

etc-image-41

우선 menu폴더를 만들고

xml을 생성해

item을 입력하자.

이때 actionlayout을 option_action_layout으로 줬는데

etc-image-42
option_action_layout

layout폴더에 새로 만든 xml이다.

여기선 내가 넣은 아이콘과

입력을 가능하게 할

EditText를 넣어주었다.

그리고 imeoptions를 actionSearch로 설정하였다.

etc-image-43

그리고 자바로 와서

참조변수를 만들어주고

onCreateOptionMenu 메소드를 이용해

inflate해준다.

 

그리고 이 과정 속에서

etc-image-44

커스텀한 뷰안에 있는 EditText를 찾아와야한다.

findid가 아닌 menu.findItem으로 이를 찾아와서

위의 코드처럼 입력해준다.
(나도 이해가 안된다.. ㅜㅜ)

 

etc-image-45