티스토리 뷰

안드로이드는 메뉴 버튼을 배치하고 이를 터치했을 때 메뉴가 보이도록 할 수 있다. 이런 방식의 메뉴를 옵션 메뉴라고 하며, 화면를 길게 눌렀을 때 팝업 형태로 나타나는 메뉴를 컨텍스트 메뉴라고 한다. 

 

옵션 메뉴와 컨텍스트 메뉴는 각각 아래의 메서드들을 사용하여 액티비티에 추가할 수 있다.

 

boolean onCreateOptionsMenu(Menu menu)
void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo info)

또한 전달되는 Menu와 ContextMenu객체가 가지고 있는 add 메서드로 메뉴 아이템을 액티비티 코드에서 추가할 수도 있다. 

 

메뉴를 위한 레이아웃 파일은 반드시 app/res/menu 디렉토리를 생성한 뒤에 그 내부에 추가하여야 안드로이드 내에서 해당 레이아웃이 메뉴임을 인식한다.

 

◎app/res/menu/menu_main.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:title="refresh"
          android:id="@+id/menu_refresh"
          app:showAsAction="always"
          android:icon="@android:drawable/ic_menu_rotate"/>
    <item android:title="search"
          android:id="@+id/menu_search"
          app:showAsAction="always"
          android:icon="@android:drawable/ic_menu_search"/>
    <item android:title="settings"
          android:id="@+id/menu_settings"
          app:showAsAction="always"
          android:icon="@android:drawable/ic_menu_manage"/>
</menu>

showAsAction 속성은 메뉴를 상단바에 노출시킬건지를 묻는 속성 값이며, 설정할 수 있는 값은 다음과 같다.

 

속성 값 설명
always 항상 액션바에 아이템을 추가하여 표시한다.
never 액션바에 아이템을 추가하여 표시하지 않는다. (default)
ifRoom 액션바에 여유 공간이 있을 때만 아이템을 표시한다.
withText title 속성으로 설정된 제목을 같이 표시한다.
collapseActionView 아이템에 설정한 뷰의 아이콘만 표시한다.

 

이후에 fragment와 마찬가지로 메인 액티비티에서 menu 레이아웃을 액티비티 메모리에 로드하기 위해 inflate 한 뒤, 아래와 같이 각 메뉴가 선택되었을 때 동작할 수 있도록 onOptionItemSelected() 메서드를 작성한다.

 

◎MainActivity.java

package com.example.menu_ex;

import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        int curID = item.getItemId();

        switch(curID) {
            case R.id.menu_refresh:
                Toast.makeText(this, "새로고침 메뉴가 선택되었습니다.", Toast.LENGTH_LONG).show();
                break;
            case R.id.menu_search:
                Toast.makeText(this, "검색 메뉴가 선택되었습니다.", Toast.LENGTH_LONG).show();
                break;
            case R.id.menu_settings:
                Toast.makeText(this, "설정 메뉴가 선택되었습니다.", Toast.LENGTH_LONG).show();
                break;
            default:
                break;
        }
        return super.onOptionsItemSelected(item);
    }
}

실행해보면, 다음과 같이 메뉴를 클릭하였을 때 토스트 메시지가 잘 동작한다.

 

반응형
Comments