북극곰의 개발일기

오버플로 메뉴 생성과 관리





posted by purplebeen on Sat Feb 03 2018 23:03:05 GMT+0900 (KST) in Android


블로그에 글 안올린지도 꽤 됬네 ㅋㅋ 각설하고 오늘은 메뉴를 구성해보자

오버플로 메뉴란 위 사진 처럼 안드로이드에서 사용되는 메뉴를 의미한다.

안드로이드 4.0 미만의 버전에서는 하단부에 나타났지만 그 이후의 버전 부터는 오른쪽 상단에 나타나게 된다.

메뉴에 해당되는 아이템들은 /프로젝트명/menu/menu.xml에 저장된다.

그럼 먼저 메뉴에 들어갈 아이템들을 설정해보자.

각 메뉴들이 클릭되엇을때 라디오 버튼이 표시되도록 하기 위해서 group으로 묶었다.

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context="com.example.baehy.menuexample.MainActivity">
    <group android:checkableBehavior="single" >
        <item
            android:id="@+id/menu_red"
            android:orderInCategory="1"
            android:showAsAction="never"
            android:title="@string/red_string"/>
        <item
            android:id="@+id/menu_blue"
            android:orderInCategory="2"
            android:showAsAction="never"
            android:title="@string/blue_string" />
        <item
            android:id="@+id/menu_green"
            android:orderInCategory="3"
            android:showAsAction="never"
            android:title="@string/green_string" />
    </group>
</menu>

각 아이템들을 설정해주었다.

orderInCategory는 메뉴에 나타나는 순서를 의미 하고 showAsAction은 액션바에 메뉴를 겉에 들어나게 보이도록 하는 옵션인데,

자칫 잘못하면 프로그램이 복잡해질 수 있기 때문에 꼭 필요한 경우가 아니라면 사용되지 않는다.

Title를 보게 되면, @string/값이름 형태롤 들어가는 것을 볼 수 있는데,

이는 /프로젝트명/values/string.xml 에서 설정해준다.

<resources>
    <string name="app_name">MenuExample</string>
    <string name="action_settings">Settings</string>
    <string name="red_string">Red</string>
    <string name="blue_string">Blue</string>
    <string name="green_string">Green</string>
</resources>

이렇게 string name = 값 이름 값

형태로 설정해서 각 값이름에 대한 설명들을 정의해주고 있다.

이를 통해 스트링 값까지 확인을 했으면, 이제 MainActivity.java에서 실질적으로 메뉴를 눌렀을때 하는 동작들을 설정해 줘야 하는데,

그 전에 먼저 메인 액티비티에 id를 넣어주자.

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/
apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:context="com.example.baehy.menuexample.MainActivity"
    android:id="@+id/layoutView">

자 이제 그러면 자바 파일을 수정해서 실질적으로 메뉴들이 돌아갈 수 있도록 설정을 해줘야 하는데,

그 전에 메뉴가 어떻게 실행되는지 살펴보면,

 @Override public boolean onCreateOptionsMenu(Menu menu) { 
	 // Inflate the menu; this adds items to the action bar if it is present. 
	 getMenuInflater().inflate(R.menu.menu_main, menu); 
	 return true; 
}

먼저 onCreateOptionMenu메소드를 통해서 XML 파일에 포함된 메뉴를 생성한다.

자 그럼 이제 메뉴의 구현이 완료되었으니 이제 각 메뉴를 눌렀을때 항목을 구현해보자

@Override public boolean onOptionsItemSelected(MenuItem item) { 
	android.support.design.widget.CoordinatorLayout mainLayout = 
	(android.support.design.widget.CoordinatorLayout) findViewById(R.id.layoutView); 
	switch(item.getItemId()) { 
		case R.id.menu_red:
			if(item.isChecked()) 
				item.setChecked(false); 
			else 
				item.setChecked(true); 
			mainLayout.setBackgroundColor(Color.RED); 
			return true; 
		case R.id.menu_blue: 
			if(item.isChecked()) 
				item.setChecked(false); 
			else 
				item.setChecked(true); 
			mainLayout.setBackgroundColor(Color.BLUE); 
			return true; 
		case R.id.menu_green: 
			if(item.isChecked()) 
				item.setChecked(false); 
			else 
				item.setChecked(true); 
			mainLayout.setBackgroundColor(Color.GREEN); 
			return true; 
		default: 
			return super.onOptionsItemSelected(item); 
	} 
}

메뉴에서 한 item을 선택했을때 그 아이템 객체를 인자값으로 받아오는 onOptionITemSelected()라는 메소드 이다.

기본 레이아웃을 mainLayout이라는 변수와 연동 시켜 준 다음,

각 메뉴의 항목에 따라서 기본 레이아웃의 backGround color(배경 색)이 바뀌게 한다.