본문으로 바로가기

안드로이드 어플리케이션 만들기 2주차 


- 앞으로 1주일마다 혹은 중간중간 업데이트 사항이 있을 때마다 포스팅 할 예정입니다.

(내용에 틀린부분이 있으면 지적 꼭 부탁드립니다 ! 개발 초보라 제가 이해한 대로 쓰고 있으니 꼭 지적 부탁드립니다.)

 




Action Bar에 아이콘 넣기

 액션 바에 쓰기 아이콘을 넣고 기록을 적을 수 있는 액티비티로 전환되게 만들어 보려고 합니다.


-1)menu_main.xml 만들기

액션 버튼이나 액션 바 안에서 사용 가능한 모든 액션 아이템들은 메뉴 리소스들을 정의한 res/menu 밑에 xml파일을 만들어서 다룬다고 합니다. 

res/menu/menu_main.xml을 생성합니다. 

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
   
<item android:id="@[+][package:]id/resource_name"
         
android:title="string"
         
android:titleCondensed="string"
         
android:icon="@[package:]drawable/drawable_resource_name"
         
android:onClick="method name"
         
android:showAsAction=["ifRoom" | "never" | "withText" | "always" | "collapseActionView"]
         
android:actionLayout="@[package:]layout/layout_resource_name"
         
android:actionViewClass="class name"
         
android:actionProviderClass="class name"
         
android:alphabeticShortcut="string"
         
android:numericShortcut="string"
         
android:checkable=["true" | "false"]
         
android:visible=["true" | "false"]
         
android:enabled=["true" | "false"]
         
android:menuCategory=["container" | "system" | "secondary" | "alternative"]
         
android:orderInCategory="integer" />
   
<group android:id="@[+][package:]id/resource name"
           
android:checkableBehavior=["none" | "all" | "single"]
           
android:visible=["true" | "false"]
           
android:enabled=["true" | "false"]
           
android:menuCategory=["container" | "system" | "secondary" | "alternative"]
           
android:orderInCategory="integer" >
       
<item />
   
</group>
   
<item >
       
<menu>
         
<item />
       
</menu>
   
</item>
</menu>

- http://developer.android.com/intl/ko/guide/topics/resources/menu-resource.html

개발자 홈페이지에 있는 양식 중에서 잘 모르겠는거 다 빼고 <item>안의 id, icon, title, showAsAction만 남겨줍시다. 

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/write_actionBar"
android:title="string"
android:icon="@[package:]drawable/drawable_resource_name"
android:showAsAction="ifRoom" >
</item>
</menu>

-menu_main.xml

-2)menu_main.xml 값 설정하기

위의 id, title, icon, showAsAction을 하나씩 해봅시다. 

1. id값은 임의로 만들어서 지정해줍니다. 버튼에 id값 주듯이(여기서는 write_actionBar로 지정)

2. title값은 메뉴 타이틀이라고 나오니 임의로 써줍시다. 제 경우는 write로 수정하였습니다. String.xml에서 추가해주고 넣어줘도 되는 것 같고, 그냥 넣어줘도 되는 듯 합니다. String.xml에 추가하고 넣어줍시다. 

3. 이제 icon을 넣어봅시다. 

 앞선 1주차에서 아이콘 다운받는 곳 링크를 올렸었는데요. https://github.com/google/material-design-icons/ 에서 받은 아이콘중 Action 폴더안에 있는 drawable-xhdpi 폴더 아이콘중 선택해서 진행하겠습니다. 글쓰기 버튼과 비슷한 것을 찾아보면, 없네요. image 폴더에 가니 연필아이콘이 있습니다. 이걸 쓰도록 하겠습니다. 가이드라인을 찾아봤는데 아이콘은 24dp로 나오네요. (http://www.slideshare.net/wonchoel/material-design-45978879를 찾아봤습니다.) 그럼 아이콘은 xhdpi - 24dp로 결정. 

 res 폴더를 마우스 우클릭하고 New - Image Asset을 선택해줍니다. Asset Type은 Action Bar and Tab icons로 설정. resource name은 ic_action_write로 설정. drawble에 ic_action_white.png가 추가됨을 확인 할 수 있습니다. 그럼 이제 menu_main.xml파일의 android:icon에 "@drawble/ic_action_white"를 넣어줍니다.

(추가할 내용 : Image 이름이 ic_edit_white_24dp.png인 이유 - 책에 나와있음)


4. showAsAction은 ifRoom으로 설정합니다. 위의 링크 페이지에 보면 showAsAction의 옵션별로 설정이 나와있는데, ifRoom의 경우는 자리가 있으면 표시, 없으면 오버플로우(세로로 점3개가 늘어져있는 추가옵션 아이콘)안으로 들어가는 것으로 보입니다. 빨간 밑줄이 쳐져 있을 것입니다. 구글링 결과 xml코드를 조금 수정해주어야 하는데, 

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:ExerApp2="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" tools:context=".MainActivity">
<item android:id="@+id/write_actionBar"
android:title="@string/menu_write"
android:icon="@drawable/ic_action_write"
ExerApp2:showAsAction="ifRoom" >
</item>
</menu>

 -menu_main.xml

 잘 보면 <menu> 안에 xmlns:ExerApp2="http://scgemas.android.com/apk/res-auto"줄이 추가 되었고, 기존의 android:showAsAction="ifRoom"의 android가 ExerApp2로 변경됨을 볼 수 있습니다. 

바꿔주는 이유는 안드로이드 2.1이상 버전에서 호환가능하도록 "서포트 라이브러리"에서 동작하는 경우 showAsAction이 'android:' 라는 namespace(C++할때 들어 봤던 기억이)를 사용할 수 없어서 XML namespace를 따로 정의해주어야 한다고 합니다.

( 상세 내용은 두번째 참고사이트와 http://stackoverflow.com/questions/17914017/android-4-3-menu-item-showasaction-always-ignored를 참고바랍니다. 저도 잘 이해가 안 가지만 넘깁니다.) 이제 빨간줄은 해결됐습니다. 


-3)menu_main.xml 과 MainActivity 연결하기

 이제 이 xml 파일을 메인 액티비티에 연결해줍시다. 

@Override
public boolean onCreateOptionsMenu(Menu menu) {
//MenuInflater menuInflater = getMenuInflater();
//menuInflater.inflate(R.menu.menu_main, menu);아랫줄의 원래 형태
getMenuInflater().inflate(R.menu.menu_main, menu);
return super.onCreateOptionsMenu(menu);
}

-MainActivity.class

위의 메소드를 MainActivity에 추가해줍니다. MenuInflater를 만들고(getMenuInflater()로 바로 받아와서 inflate시키는 코드로 수정하였습니다), menu_main.xml을 inflate시킵니다. 제 생각으로는 onCreateOptionsMenu()도 onCreate()처럼 액티비티 실행시 실행되는 내용 같습니다. 





참고사이트 : http://developer.android.com/intl/ko/training/material/theme.html(머테리얼 디자인 가이드라인 설명, 안드로이드 공식 한글)

https://uartis.wordpress.com/project-2/android-%EA%B5%AC%EA%B8%80%EC%9D%98-%EB%A9%94%EB%89%B4%EC%96%BC%EC%9D%84-%EB%B2%88%EC%97%AD%ED%95%98%EA%B8%B0/android-action-bar-%EC%B6%94%EA%B0%80%ED%95%98%EA%B8%B0-0/android-action-bar-%EC%B6%94%EA%B0%80%ED%95%98%EA%B8%B0-2-%EC%95%A1%EC%85%98-%EB%B2%84%ED%8A%BC-%EC%B6%94%EA%B0%80%ED%95%98%EA%B8%B0/ (Action Bar 추가하기)

http://bitsoul.tistory.com/21 (안드로이드 옵션메뉴 OptionMenu 예제1) (여기가 잘 나와있다.)