728x90
728x90

안드로이드 메뉴는 옵션 메뉴와 컨텍스트 메뉴 두 가지로 분류된다.
각각의 특징에 대해 실습과 함께 개념을 알아보자.

 

 

 

1) 옵션 메뉴


메뉴 xml 파일 생성 후 java에서 호출한다. java 코드만으로 메뉴를 생성하는 방법.

 

* XML을 이용한 옵션 메뉴

메뉴 코딩 - > 메뉴 파일 등록  -> 메뉴 선택 시 작동할 내용 코딩

 

1 xml 파일 형식

<menu>
	<item
    	android:id="@+id/항목1아이디"
        android:title="항목1 제목" />
    <item
    	android:id="@+id/항목2아이디"
        android:title="항목2 제목" />
</menu>

 

2 onCreateOptionMenu() 메소드

Inflater : 스쿠버다이빙에서 바람을 넣는 용도로 쓰는데 팽창시키겠다는 뉘앙스. activity를 기본으로 가지고 있고 메뉴 등을 넣을 때 쓴다. Inflater 객체에서 Inflater메소드를 가지고 새로운 것에 화면을 연결해 주는 것이다.
정적으로 존재하는 XML파일을 Java 코드에서 접근하여 실제 객체로 만들어 사용하는 것
메뉴 인플레이터 개체는 메뉴 XML 파일을 자바 코드에서 가져와 사용하는 것이고 레이아웃 인플레이터는 레이아웃 XML파일을 자바코드에서 가져와 사용하는 것이다.

public boolean onCreateOptionsMenu(Menu menu) {
	super.onCreateOptionsMenu(menu);
    MenuInflater mInflater = getMenuInflater();
    mInflater.inflate(R.menu.메뉴XML아이디, menu);
    return true;
}

 

3 onOptionsItemSelected() 메소드 

public boolean onOptionsItemSelected(MenuItem item) {
	switch (item.getItemId()) {
    case R.id.항목1아이디:
    	항목 1을 선택했을 때 실행할 코드
        return true;
    case R.id.항목2아이디:
    	항목 2을 선택했을 때 실행할 코드
        return true;
    }
    return false;
 }

 

 

실습하기

7-1. 배경색 변경 앱 만들기 (Project7_1, com.cookandroid.project7_1)

 

1) 화면 디자인 : 바깥 리니어레이아웃의 id를 baseLayout으로 지정하며 텍스트뷰 1개와 버튼 1개 생성, 버튼 id는 button1로 한다.

 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    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:id="@+id/baseLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="키패드의 MENU 버튼을 누르세요"
        android:textSize="20dp"/>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/button1"
        android:text="이전 버튼"/>
</LinearLayout>

 

menu1.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="match_parent"
    android:layout_width="match_parent">
    <item
        android:id="@+id/itemRed"
        android:title="배경색(빨강)">
    </item>
    <item
        android:id="@+id/itemGreen"
        android:title="배경색(초록)">
    </item>
    <item
        android:id="@+id/itemBlue"
        android:title="배경색(파랑)">
    </item>
    <item
        android:title="버튼 변경 >>">
            <menu>
                <item
                    android:id="@+id/subRotate"
                    android:title="버튼 45도 회전" />
                <item
                    android:id="@+id/subSize"
                    android:title="버튼 2배 확대" />
            </menu>
    </item>
</menu>

 

 

자바 코드 수정 : activity_main.xml의 레이아웃과 버튼에 대응할 전역변수 2개와 메인함수 onCreate()안에서 위젯 변수 2개에 위젯을 대입한다. onCreateOptionsMenu()를 Activity 클래스로부터 오버라이드한다. 자동완성된 코드에 나머지를 채워 완성한다. onOptionsItemSelected()는 메뉴를 클릭했을 때 동작할 메소드를 코딩한다.

 

 

package com.example.myapplication7;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.Button;
import android.widget.LinearLayout;

import androidx.annotation.NonNull;

public class MainActivity extends Activity {
    LinearLayout baseLayout;
    Button button1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setTitle("배경색 바꾸기");

        baseLayout = (LinearLayout) findViewById(R.id.baseLayout);
        button1 = (Button) findViewById(R.id.button1);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
        MenuInflater mInflater = getMenuInflater();
        mInflater.inflate(R.menu.menu1, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()){
            case R.id.itemRed:
                baseLayout.setBackgroundColor(Color.RED);
                return true;
            case R.id.itemBlue:
                baseLayout.setBackgroundColor(Color.BLUE);
                return true;
            case R.id.itemGreen:
                baseLayout.setBackgroundColor(Color.GREEN);
                return true;
            case R.id.subRotate:
                button1.setRotation(45);
                return true;
            case R.id.subSize:
                button1.setScaleX(2);
                return true;
        }
        return false;
    }
}

 

위 예제를 자바코드로만 코딩하려면, onCreateOptionsMenu() 메소드 안에서 메뉴 XML 파일에 접근하는 대신에 직접 Menu.add() 메소드로 메뉴 항목을 추가한다.

 

 

추가적으로 위 예제 실습 7-1을 변경해보자.

 

 


 

2) 컨텍스트 메뉴

컨텍스트는 구문, 명령이라는 뜻인데 메뉴가 정해지지 않고 대상에 따라 특화되어 나오는 메뉴를 말한다.
레이아웃 또는 버튼, 에디트텍스트 등의 위젯을 롱클릭하면 나타나는 Windows의 팝업창과 비슷

 

컨텍스트 메뉴가 나오게 할 위젯마다 별도의 파일로 만들어야 하며 메뉴 XML문법은 옵션 메뉴와 동일하다.
onCreateContextMenu() 메소드에는 위젯별로 컨텍스트 메뉴가 나타나야 하므로, 위젯별 컨텍스트 메뉴를 if문으로 등록한다. 

 

public void onCreateContextMenu(ContextMenu menu,
			View v, ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        
        MenuInflater mInflater = getMenuInflater();
        if(v==위젯1) {
        	mInflater.inflate(R.menu.첫번째메뉴XML파일, menu);
		}
        if(v==위젯2) {
        	mInflater.inflate(R.menu.두번째메뉴XML파일, menu);
        }
}

 

* 프로젝트명 : Project7_2
* 패키지명 : com.cookandroid.project7_2
* 레이아웃 id : baseLayout
* 버튼은 2개 생성
하며 id는 button1, button2로 한다.

<LinearLayout
	android:gravity="center_horizontal"
	<Button
    	android:id="@+id/button1"
        android:text="배경색 변경" />
    <Button
    	android:id="@+id/button2"
        android:text="버튼 변경" />
</LinearLayout>     

 

menu1.xml은 배경색 변경과 관련된 3개의 항목을, menu2.xml은 버튼과 관련된 2개의 항목을 생성한다.

//menu1.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android">
	<item
    	android:id="@+id/itemRed"
        android:title="배경색(빨강)">
    </item>
    <item
    	android:id="@+id/itemBlue"
        android:title="배경색(파랑)">
    </item>
    <item
    	android:id="@+id/itemGreen"
        android:title="배경색(초록)">
    </item>
</menu>
//menu2.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android">
	<item
    	android:id="@+id/subRotate"
        android:title="버튼 45도 회전">
    </item>
    <item
    	android:id="@+id/subSize"
        android:title="버튼 2개 확대">
    </item>
</menu>

 

자바 코드 : activity_main.xml 의 레이아웃과 버튼 2개에 대응할 전역변수 3개, 메인 함수 onCreate() 안에서 위젯 변수 3개에 위젯을 대입한다. 2개의 버튼 위젯 변수를 registerForContextMenu() 에 등록한다.

 

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
	super.onCreateContextMenu(menu, v, menuInfo);
    
    MenuInflater mInflater = getMenuInflater();
    if(v==button1) {
    	menu.setHeaderTitle("배경색 변경");
        menu.setHeaderIcon(R.drawble.icon1);
        mInflater.inflate(R.menu.menu1, menu);
        }
    if(v==button2) {
    	mInflater.inflate(R.menu.menu2, menu);
    }
}

 

실습 7-2에서 실습한 컨텍스트 메뉴를 XML파일 없이 Java코드로만 완성해보자.

728x90
728x90
블로그 이미지

coding-restaurant

코딩 맛집에 방문해주셔서 감사합니다.

,

v