Android - 액션 바 사용하기(1)

유의선·2023년 6월 18일
0

안드로이드의 메뉴에는 옵션메뉴와 컨텍스트 메뉴 두 종류가 있다.

옵션 메뉴는 앱의 상단 타이틀 부분에 배치되는 메뉴 버튼을 눌렀을 때 보이는 메뉴이다.

컨텍스트 메뉴는 화면을 길게 누르면 나타나는 메뉴로, 입력상자를 길게 누르면 나타나는 '복사하기', '붙여넣기'와 같은 팝업 형태로 나타난다.

속성설명
옵션 메뉴시스템 [메뉴] 버튼을 눌렀을 때 나타나는 메뉴로 각 화면마다 설정할 수 있는 주요 메뉴이다.
컨텍스트 메뉴화면을 길게 누르면 나타나는 메뉴로 뷰에 설정하여 나타나게 할 수 있다. 텍스트뷰의 편집 상태를 바꾸거나 할 때 사용된다.

각각의 메뉴를 액티비티에 추가하고 싶은 경우에는 다음의 두 메소드를 재정의하여 메뉴 아이템을 추가하면 된다.

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

메소드로 전달되는 Menu나 ContextMenu 객체에 add 메소드를 사용해서 메뉴 아이템을 추가한다.

MenuItem add (int groupid, int itemid, int order, CharSequence title)
MenuItem add (int groupid, int itemid, int order, int titleRes)
SubMenu addSubMenu(int titleRes)

groupid 값은 아이템을 하나의 그룹으로 묶을 때 사용한다.
itemId는 아이템이 갖는 고유 ID 값으로 아이템이 선택됬을 때 각각의 아이템을 구분할 때 사용한다.
addSubMenu는 아이템이 많아서 서브메뉴로 추가하고 싶을 때 사용한다.

메뉴는 위의 방법처럼 코드에서 추가하는 방법도 있고, XML 메뉴의 속성을 정의한 후 객체로 로딩하여 참조하는 간단한 방법도 있다.


옵션 메뉴 만들기

메뉴를 위한 XML 파일은 반드시 menu 폴더 안에 들어 있어야 한다.
그러므로 res 폴더 안에 menu 폴더를 만들고, 그 안에 menu_main.xml 파일을 만든다.

menu_main.xml 파일에는 새 개의 item 태그를 추가한다.
이 때 menu 태그의 xmlns:app 태그도 추가해 item 태그의 showAsAction이 인식되도록 한다.

<?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:title="새로고침"
        android:icon="@drawable/menu_refresh"
        app:showAsAction="always"
        />

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

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

</menu>

item 태그는 하나의 메뉴에 대한 정보를 담고 있다.

id 속성은 각각의 메뉴를 구분하기 위해 사용된다.
title 속성은 메뉴에 표시되는 글자이다.
icon 속성에 이미지를 넣으면 아이콘으로 표시된다.
showAsAction 속성은 이 메뉴를 항상 보이게 할 것인지 숨겨둘 것인지 지정할때 사용된다.

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

MainActivity에서 onCreateOptionsMenu 메소드와 onOptionsItemSeleted 메소드를 재정의한다.


...

		@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_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);
        }

onCreateOptionsMenu 메소드는 액티비티가 만들어질 때 미리 자동으로 호출되어 화면에 메뉴 기능을 추가할 수 있도록 한다.
이때 메뉴를 위한 XML 정보를 메모리에 로딩하기 위해 메뉴 인플레이터 객체를 사용한다.

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

onOptionsImtenSelected 메소드는 각각의 메뉴 아이템이 선택됬을 때 호출되는 메소드로, 이 메소드의 파라미터로 전달되는 MenuItem 객체를 사용해 선택된 메뉴 아이템의 정보를 확인한 후 처리할 수 있다.

		@Override
        public boolean onOptionsItemSelected(@NonNull 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);
        }


컨텍스트 메뉴 만들기

menu 폴더 안에 컨텍스트 메뉴에 사용할 menu_context.xml을 만든다

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

    <item
        android:id="@+id/menu_a"
        android:title="A"
        />

    <item
        android:id="@+id/menu_b"
        android:title="B"
        />

    <item
        android:id="@+id/menu_c"
        android:title="C"
        />

</menu>

activity_main.xml 파일에 컨텍스트 메뉴를 등록할 뷰를 만든다. 여기선 TextView를 사용했다.

MainActivity를 수정한다.

...

    public class MainActivity extends AppCompatActivity {

        TextView textView;

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

            textView = findViewById(R.id.textView);
            registerForContextMenu(textView);
        }

       ...

        @Override
        public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
            getMenuInflater().inflate(R.menu.menu_context, menu);
        }

        @Override
        public boolean onContextItemSelected(@NonNull MenuItem item) {

            int curId = item.getItemId();

            switch (curId) {
                case R.id.menu_a:
                    Toast.makeText(this, "Context A", Toast.LENGTH_SHORT).show();
                    break;
                case R.id.menu_b:
                    Toast.makeText(this, "Context B", Toast.LENGTH_SHORT).show();
                    break;
                case R.id.menu_c:
                    Toast.makeText(this, "Context C", Toast.LENGTH_SHORT).show();
                    break;
                default:
                    break;
            }

            return super.onContextItemSelected(item);
        }
    }

registerForContextMenu 메소드를 사용해 textView 뷰에 컨텍스트 메뉴를 등록한다.

			textView = findViewById(R.id.textView);
            registerForContextMenu(textView);

옵션 메뉴때와 같이 onCreateContextMenu 메소드와 onContextItemSeleted 메소드를 재정의한다.

 		@Override
        public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
            getMenuInflater().inflate(R.menu.menu_context, menu);
        }

        @Override
        public boolean onContextItemSelected(@NonNull MenuItem item) {

            int curId = item.getItemId();

            switch (curId) {
                case R.id.menu_a:
                    Toast.makeText(this, "Context A", Toast.LENGTH_SHORT).show();
                    break;
                case R.id.menu_b:
                    Toast.makeText(this, "Context B", Toast.LENGTH_SHORT).show();
                    break;
                case R.id.menu_c:
                    Toast.makeText(this, "Context C", Toast.LENGTH_SHORT).show();
                    break;
                default:
                    break;
            }

            return super.onContextItemSelected(item);
        }

textView를 길게 누르면 아래와 같은 컨텍스트 메뉴가 나타난다.

0개의 댓글