본문 바로가기

안드로이드

액션바

반응형

옵션 메뉴 - 시스템 [메뉴] 버튼을 눌렀을 때 나타나는 메뉴로 각 화면마다 설정할 수 있는 주요 메뉴

컨텍스트 메뉴 - 화면을 길게 누르면 나타나는 메뉴로 뷰에 설정하여 나타나게 할 수 있음. 텍스트뷰의 편집 상태를 바꾸거나 할 때 사용

 

안드로이드 스튜디오를 이용하여 app/res 폴더에 menu 폴더를 새로 만들고 menu_main.xml을 새로 생성하는 과정에서,

안드로이드 스튜디오는 /app/res/menu 폴더 안에 메뉴를 위한 xml 파일이 만들어진다는 것을 미리 알고 있다

따라서 메뉴를 위한 xml 파일은 반드시 menu 폴더 안에 들어있어야 한다

 

menu_main.xml

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

    <item
        android:id="@+id/menu_refresh"
        android:icon="@drawable/menu_refresh"
        android:title="새로고침"
        app:showAsAction="always"></item>

    <item
        android:id="@+id/menu_search"
        android:icon="@drawable/menu_search"
        android:title="검색"
        app:showAsAction="always"></item>


    <item
        android:id="@+id/menu_settings"
        android:icon="@drawable/menu_settings"
        android:title="설정"
        app:showAsAction="always"></item>


</menu>

<menu> 태그에 xmls:app이 있어야 <item> 태그의 showAsAction이 제대로 인식된다

 

<item> 태그의 title 속성에 넣은 값은 메뉴에 표시되는 글자이다

아이콘으로 표시하고 싶을 때는 icon 속성에 이미를 넣을 수 있다

showAsAction 속성은 이 메뉴를 항상 보이게 할 것인지 아니면 숨겨둘 것인지를 정할 수 있다

 

android:로 시작하는 속성은 기본 api에 포함된 속성이고 app:로 시작하는 속성은 프로젝트에 들어있는 속성이다

만약 외부 라이브러리가 추가되어 있다면 그 외부 라이브러리에서 제공되는 속성도 app:로 참조하면 추가할 수 있다

 

showAsAction 속성 값

always
항상 액션바에 아이템을 추가하여 표시

never
액션바에 아이템을 추가하여 표시지 않는다(디폴트 값)

ifRoom
액션바에 여유 공간이 있을 때만 아이템을 표시

withText
title 속성으로 설정된 제목을 같이 표시한다

collapseActionView
아이템에 설정한 뷰(actionViewLayout으로 설정한 뷰)의 아이콘만 표시

 

MainActivity.java에 재정의된 onCreateOptionsMenu 메소드는 액티비티가 만들어질 때 미리 자동 호출되어 화면에 메뉴 기능을 추가할 수 있도록 한다

만들어놓은 메뉴 xml 파일은 xml 레이아웃 파일처럼 소스 코드에서 인플레이션 한 후 메뉴에 설정할 수 있다

이 때 메뉴를 위한 xml 정보를 메모리에 로딩하기 위해 메뉴 인플레이터 객체를 사용한다

 

MainActivity

package com.example.a30_sampleoptionmenu;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;

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(MenuItem item) {

        int curId = item.getItemId();

        switch (curId) {
            case R.id.menu_refresh:
                Toast.makeText(this, "새로고침 메뉴 선택", Toast.LENGTH_SHORT).show();
                break;

            case R.id.menu_search:
                Toast.makeText(this, "검색 메뉴 선택", Toast.LENGTH_SHORT).show();
                break;

            case R.id.menu_settings:
                Toast.makeText(this, "설정 메뉴 선택", Toast.LENGTH_SHORT).show();
                break;

            default:
                break;
        }

        return super.onOptionsItemSelected(item);
    }
}

 

화면이 처음 만들어 질때 메뉴를 정해놓는 것이 아니라, 화면이 띄워진 후에 메뉴를 바꾸고 싶다면 onPrepareOptionsMenu 메소드를 재정의하면 된다

이 메소드는 메뉴가 새로 보일 때마다 호출되므로 메뉴 항목을 추가하거나 뺄 수 있어 메뉴 아이템을 변경할 수 있다

특히 메뉴의 속성을 바꿀 수 있으므로 메뉴를 활성화하거나 비활성화하여 사용자에게 앱의 상태에 따라 메뉴를 사용하거나 사용하지 못하도록 만들 수 있다

 

컨텍스트 메뉴는 registerForContextMenu 메소드를 사용하면 되고, onContextItemSelected 메소드로 선택된 컨텍스트 메뉴를 처리할 수 있다

반응형

'안드로이드' 카테고리의 다른 글

액션바에 검색창 만들기  (0) 2021.10.20
액션바 아이콘 바꾸기  (0) 2021.10.19
한 화면에 2개의 프래그먼트  (0) 2021.10.19
프래그먼트  (0) 2021.10.18
라이프사이클  (0) 2021.10.18