처음부터 차근차근

Android 메뉴 본문

프로그래밍/Android

Android 메뉴

_soyoung 2022. 4. 12. 12:45
반응형

inflate

inflate = 팽창

안드로이드에서는 XML 파일을 읽어서 실제 메뉴로 만들어주는 것을 inflate(팽창)한다고 한다.

메뉴 리소스를 팽창(inflate)하면 실제 메뉴가 생성된다.

 

inflate 소스

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

 

 

메뉴 종류

안드로이드가 지원하는 메뉴의 종류에는 3가지가 있다.

 

1. 옵션 메뉴 : 액티비티의 주 메뉴. 화면 아래쪽에 숨겨져 있으며, MENU 버튼을 눌러야 나타난다.

2. 컨텍스트 메뉴 : 화면을 길게 누르고 있으면 화면 중앙에 나타난다.

3. 서브 메뉴 : 메뉴 항목을 가지는 일종의 팝업

 

 

옵션 메뉴 생성하는 방법

1. 코드로 생성하기
2. XML로 생성하기

 

 

xml로 메뉴 생성

res / menu 디렉토리 만들기

디렉토리 안에다가 mymenu.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/mnuPlus"
        android:icon="@android:drawable/btn_plus"
       app:showAsAction="ifRoom"
        android:title="더하기"/>
    <!-- ifRoom : 만약에 공간이 있으면 넣기-->

    <item
        android:id="@+id/mnuMinus"
        android:icon="@android:drawable/btn_minus"
        app:showAsAction="always"
        android:title="빼기"/>
    <!-- always : 항상 넣기-->
</menu>
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) {
        super.onCreateOptionsMenu(menu);
        MenuInflater menuInflater = getMenuInflater();
        menuInflater.inflate(R.menu.mymenu, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch(item.getItemId()) {
            case R.id.mnuPlus:
                Toast.makeText(this, "PLUS PLUS", Toast.LENGTH_SHORT).show();
                return true;
            case R.id.mnuMinus:
                Toast.makeText(this, "MINUS MINUS", Toast.LENGTH_SHORT).show();
                return true;
            default:
            return super.onOptionsItemSelected(item);
        }

    }
}

onOptionsItemSelected()

옵션 메뉴를 클릭했을 때 호출되는 함수. 옵션 메뉴 클릭 이벤트 처리를 담당한다.

 

 

실행결과

 

 

코드로 메뉴 생성

아이콘 생성 방법

1. drawable 마우스 오른쪽 new -> Image Asset

2. 이미지와 같이 이름과 타입 설정

3. 그 다음 원하는 path 클릭하고 Finish

이렇게 하면 위에서 골랐던 path에 아이콘이 새로 생긴 것을 볼 수 있다.

 

코드

(bel, tel 이름으로 아이콘을 미리 생성해놓음)

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) {
        super.onCreateOptionsMenu(menu);

        MenuItem item1 = menu.add(0, 1, 0, "전화기");
        item1.setIcon(R.drawable.tel);
        item1.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);

        MenuItem item2 = menu.add(0, 2, 0, "종");
        item2.setIcon(R.drawable.bel);
        item2.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);

        return true;
    }

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch(item.getItemId()) {
            case 1:
                Toast.makeText(this, "TEL TEL", Toast.LENGTH_SHORT).show();
                return true;
            case 2:
                Toast.makeText(this, "BELL BELL", Toast.LENGTH_SHORT).show();
                return true;
            default:
            return super.onOptionsItemSelected(item);
        }
    }
}

menu.add() : 메뉴 항목 추가

 

<함수 프로토타입>

MenuItem add (int groupId, int itemId, int order, CharSequence title)

groupId - 항목의 그룹을 구성할 때 지정. 그룹 소속이 아니라 단독 항목일때는 NONE(0)으로 준다.

itemId - 항목의 고유한 ID이며, 항목 선택 시 ID로 어떤 항목을 선택했는지 알아낸다.

order - 메뉴의 순서를 지정, NONE(0)이면 추가된 순서대로 나타난다.

title - 메뉴 항목의 캡션 문자열이며 문자열 상수 또는 리소스 문자열 ID를 준다.

 

실행결과

 

onClick을 활용해서 할 수도 있다.

onClick 활용 코드

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) {
        MenuInflater menuInflater = getMenuInflater();
        menuInflater.inflate(R.menu.mymenu, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch(item.getItemId()) {
            case 1:
                Toast.makeText(this, "TEL TEL", Toast.LENGTH_SHORT).show();
                return true;
            case 2:
                Toast.makeText(this, "BELL BELL", Toast.LENGTH_SHORT).show();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

    public void onClicked(MenuItem item) {
        switch(item.getItemId()) {
            case R.id.mnuPlus:
                Toast.makeText(this, "PLUS PLUS", Toast.LENGTH_LONG).show();
                break;
            case R.id.mnuMinus:
                Toast.makeText(this, "********************", Toast.LENGTH_LONG).show();
                break;
        }
    }

}
<?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/mnuPlus"
        android:icon="@android:drawable/btn_plus"
        app:showAsAction="ifRoom"
        android:title="더하기"
        android:onClick="onClicked"/>
    <!-- ifRoom : 만약에 공간이 있으면 넣기-->

    <item
        android:id="@+id/mnuMinus"
        android:icon="@android:drawable/btn_minus"
        app:showAsAction="always"
        android:title="빼기"
        android:onClick="onClicked" />
    <!-- always : 항상 넣기-->
</menu>

 

 

컨텍스트 메뉴

컨텍스트 메뉴의 종류

1. 플로팅 컨텍스트 메뉴 : 사용자가 항목 위에서 오래 누르기(long click)를 하면 메뉴가 대화 상자처럼 떠서 표시된다.

2. 컨텍스트 액션 모드 : 현재 선택된 항목에 관련된 메뉴가 액션바에 표시된다. 여러 항목을 선택하여 특정한 액션을 한꺼번에 적용할 수 있다. 

 

 

컨텍스트 메뉴 코드

public class MainActivity extends AppCompatActivity {

    TextView text;

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

        text = (TextView) findViewById(R.id.txtContext);
        registerForContextMenu(text);
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        menu.setHeaderTitle("컨텍스트 메뉴");
        menu.add(0, 1, 0, "배경색: RED");
        menu.add(0, 2, 0, "배경색: GREEN");
        menu.add(0, 3, 0, "배경색: BLUE");
    }

    public boolean onContextItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case 1:
                text.setBackgroundColor(Color.RED);
                return true;
            case 2:
                text.setBackgroundColor(Color.GREEN);
                return true;
            case 3:
                text.setBackgroundColor(Color.BLUE);
                return true;
            default:
                return super.onContextItemSelected(item);
        }
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <TextView
        android:id="@+id/txtContext"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Only I can change my life. No one can do it for me."
        android:textSize="80sp"
        android:typeface="serif" />
</LinearLayout>

 

실행결과

 

 

 

컨텍스트 액션 모드 코드

res / menu 아래에 context.xml 파일을 새로 생성한다.

 

context.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/mnuPlus"
        android:title="더하기"
        android:icon="@android:drawable/btn_plus"/>
    <item
        android:id="@+id/mnuMinus"
        android:title="빼기"
        android:icon="@android:drawable/btn_minus"/>
</menu>
@RequiresApi(api = Build.VERSION_CODES.M)
public class MainActivity extends AppCompatActivity {

    TextView text;
    private ActionMode actionMode;

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

        text = (TextView) findViewById(R.id.txtContext);
        text.setOnLongClickListener(new View.OnLongClickListener() {

            @Override
            public boolean onLongClick(View view) {
                actionMode = startActionMode(actionModeCallBack);
                return true;
            }
        });
    }

    private ActionMode.Callback2 actionModeCallBack = new ActionMode.Callback2() {
        @Override
        public boolean onCreateActionMode(ActionMode actionMode, Menu menu) {
            actionMode.setTitle("Action Menu");
            actionMode.getMenuInflater().inflate(R.menu.contextmenu, menu);
            return true;
        }

        @Override
        public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) {
            return false;
        }

        @Override
        public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {
            switch (menuItem.getItemId()) {
                case R.id.mnuPlus:
                    Toast.makeText(MainActivity.this, "Plus", Toast.LENGTH_SHORT).show();
                    actionMode.finish();
                    return true;
                case R.id.mnuMinus:
                    Toast.makeText(MainActivity.this, "Minus", Toast.LENGTH_SHORT).show();
                    actionMode.finish();
                    return true;
                default:
                    return false;
            }
        }
        @Override
        public void onDestroyActionMode(ActionMode actionMode) {

        }
    };
}

 

실행결과

 

 

 

출처 : 안드로이드프로그래밍(22-1학기)김용남교수 강의 내용 변형 및 요약

반응형

'프로그래밍 > Android' 카테고리의 다른 글

Reactive programming(수정)  (1) 2022.04.22
팝업 메뉴  (1) 2022.04.19
리스너 객체  (2) 2022.04.08
이벤트 처리  (0) 2022.03.28
android view2  (0) 2022.03.25
Comments