7. 메뉴 – 2. Context Menu

이번에는 특정 컨트롤을 우측 마우스 버튼 클릭하였을 때 나오는 컨텍스트 메뉴(Context Menu)를 사용하는 실습을 해 봅시다.

[그림] Context 메뉴 실습 실행화면

 이번 실습에서는 두 개의 TextView를 배치하고 각각의 TextView 개체마다 서로 다른 Context Menu를 띄우는 실습을 할 거예요.

먼저 activity_main.xml 파일에 두 개의 TextView를 배치하세요.

<?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:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.ehclub.ex_contextmenu.MainActivity"
    android:orientation="vertical">

    <TextView
        android:id="@+id/tv_1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textAlignment="center"
        android:textSize="30sp"
        android:text="텍스트 뷰 1"/>
    <TextView
        android:id="@+id/tv_2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textAlignment="center"
        android:textSize="30sp"
        android:text="텍스트 뷰 2"/>

</LinearLayout>

app>>res 하위에 menu 폴더를 생성한 후에 두 개의 메뉴 파일(menu1.xml, menu2.xml)을 추가하세요.

[그림] 메뉴 폴더와 xml로 메뉴 파일 추가
[그림] 메뉴 폴더와 xml로 메뉴 파일 추가

다음은 menu1.xml 파일의 내용입니다.

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/item_red"
        android:title="배경색 RED"/>
    <item android:id="@+id/item_green"
        android:title="배경색 GREEN"/>
    <item android:id="@+id/item_blue"
        android:title="배경색 BLUE"/>
</menu>

다음은 menu2.xml 파일의 내용입니다.

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/item_fs_big"
        android:title="크게"/>
    <item android:id="@+id/item_fs_small"
        android:title="작게"/>
</menu>

두 개의 TextView 개체를 참조할 멤버 필드를 선언하고 두 번째 TextView의 textSize 속성 값을 기억할 멤버 필드를 선언하고 30으로 초기화합시다.

    TextView tv1,tv2;
    float fs = 30;

onCreate 메서드에서 두 개의 TextView 개체를 참조합니다. 그리고 registerForContextMenu 메서드를 통해 두 개체에 Context Menu를 등록합니다.

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv1 = (TextView)findViewById(R.id.tv_1);
        registerForContextMenu(tv1);
        tv2 = (TextView)findViewById(R.id.tv_2);
        registerForContextMenu(tv2);
        tv2.setTextSize(TypedValue.COMPLEX_UNIT_SP,fs);
    }

onCreateContextMenu 메서드를 재정의하여 첫 번째 인자로 전달받은 개체에 따라 적절한 메뉴를 설정합니다. 이 때 MenuInflater 개체의 inflate 메서드를 호출합니다.

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);

        MenuInflater mi = getMenuInflater();
        if(v==tv1){
            mi.inflate(R.menu.menu1,menu);
        }
        if(v==tv2){
            mi.inflate(R.menu.menu2,menu);
        }
    }

onContextItemSelected 메서드를 재정의하세요. 그리고 선택한 메뉴 항목에 따라 적절한 처리를 수행하게 작성하세요.

    @Override
    public boolean onContextItemSelected(MenuItem item) {
        switch (item.getItemId()){
            case R.id.item_red: tv1.setBackgroundColor(Color.RED); return true;
            case R.id.item_green: tv1.setBackgroundColor(Color.GREEN); return true;
            case R.id.item_blue: tv1.setBackgroundColor(Color.BLUE); return true;
            case R.id.item_fs_big: Increment(5); return true;
            case R.id.item_fs_small: Increment(-5); return true;
        }
        return false;
    }

    private void Increment(int value){
        fs += value;
        tv2.setTextSize(TypedValue.COMPLEX_UNIT_SP,fs);
    }

다음은 MainActivity.java 파일의 소스 코드입니다.

package com.example.ehclub.ex_contextmenu;

import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.TypedValue;
import android.view.ContextMenu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    TextView tv1,tv2;
    float fs = 30;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv1 = (TextView)findViewById(R.id.tv_1);
        registerForContextMenu(tv1);
        tv2 = (TextView)findViewById(R.id.tv_2);
        registerForContextMenu(tv2);
        tv2.setTextSize(TypedValue.COMPLEX_UNIT_SP,fs);
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);

        MenuInflater mi = getMenuInflater();
        if(v==tv1){
            mi.inflate(R.menu.menu1,menu);
        }
        if(v==tv2){
            mi.inflate(R.menu.menu2,menu);
        }
    }

    @Override
    public boolean onContextItemSelected(MenuItem item) {
        switch (item.getItemId()){
            case R.id.item_red: tv1.setBackgroundColor(Color.RED); return true;
            case R.id.item_green: tv1.setBackgroundColor(Color.GREEN); return true;
            case R.id.item_blue: tv1.setBackgroundColor(Color.BLUE); return true;
            case R.id.item_fs_big: Increment(5); return true;
            case R.id.item_fs_small: Increment(-5); return true;
        }
        return false;
    }

    private void Increment(int value){
        fs += value;
        tv2.setTextSize(TypedValue.COMPLEX_UNIT_SP,fs);
    }
}