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

 

 

(다시 정리 예정...)

 

 

◎ Menu

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

 

 

 

 

 

 

 

핸드폰 화면에서

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

statusBar이라고 한다.

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

ActionBar라고 한다.

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

 

 

1. Option Menu

메뉴버튼은 흔히

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

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

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

 

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

 

우선 java파일로 가서

onCreate method 밑에

onCreateOptionMenu method를 만들어주자.

그리고 menu.add를 하면

 

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

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

 

 

 

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

inflater

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

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

 

우선 MenuInflater 객체를 만들자.

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

getMenuInflater();를 사용한다.

 

그리고 res폴더에

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

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

 

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

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

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

 

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

item에 필수요소는 title인데 

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

 

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

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

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

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

 

아이템을 추가하니

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

 

다시 자바로 돌아와서

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

 

 

그 후 run을 하면

메뉴바가 있고

이를 클릭하면 내가 추가한

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

 

 

 

 

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

있는 경우가 있다.

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

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

always는 항상 보여지는 것이며

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

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

 

미리보기 화면으로

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

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

 

여기서

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

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

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

그리고 if문을 통해

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

 

 

2. Context Menu

컨텍스트 메뉴는

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

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

 

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

 

 

그리고 원래 하던대로

참조변수를 만들고

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

버튼을 눌렀을 때 

clicked button toast나오게 코딩했다.

 

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

registerForContextMenu 기능을 사용한다.

 

 

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

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

context라는 xml파일을 만들고

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

 

design 화면을 보면

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

 

 

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

onCreateContextMenu라는 메소드를 만들고

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

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

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

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

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

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

onContextItemSelected이다.

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

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

 

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

 

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

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

 

 

 

3. Popup Menu

팝업 메뉴는

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

Context menu와 비슷하지만

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

 

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

 

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

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

추가할 item들을 추가하자.

 

 

그리고 자바로 돌아와서

참조변수를 선언하고

뷰들을 넣어주자.

 

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

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

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

객체를 만든 후

inflater 객체도 만들어주고

inflate를 하게 한 후

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

 

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

 setOnMenuItemClicklister을 사용해주자!

 

그럼 메뉴를 눌렀을 때

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

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

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

 

 

 


4. SearchView

 

SearchView는 클릭하면

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

 

이를 만들기 위해

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

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

이때 actionViewClass를 androidx로 시작되는

것으로 주어야한다.

 

자바로 와서

참조변수를 선언하고

 

onCreateOptionsMenu라는 메소드를 만들어서

getMenuInflater.inflater 를 입력해준다.

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

 

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

 

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

힌트를 입력하고 싶다면 

setQueryHint를 사용하면 된다

 

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

setonQuerytextListener를 사용하자.

 

 

 


5. ActionView

 

 

액션뷰는

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

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

우선 menu폴더를 만들고

xml을 생성해

item을 입력하자.

이때 actionlayout을 option_action_layout으로 줬는데

option_action_layout

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

여기선 내가 넣은 아이콘과

입력을 가능하게 할

EditText를 넣어주었다.

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

그리고 자바로 와서

참조변수를 만들어주고

onCreateOptionMenu 메소드를 이용해

inflate해준다.

 

그리고 이 과정 속에서

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

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

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