안드로이드 스튜디오를 이용해 옵션 메뉴를 이용하는 방법에 대해서 알아봅시다.
전체적인 과정은 이러합니다.
1. 메뉴 폴더 생성 및 메뉴 XML 파일 생성, 편집 (메뉴 코딩)
2. Java코딩 : onCreate() 안에 registerForContextMenu()로 등록 (메뉴를 사용할 위젯 등록)
3. Java코딩 : onCreateContextMenu() 메소드 오버라이딩 (메뉴 파일 등록)
4. Java코딩 : onOptionsItemSelected() 메소드 오버라이딩 (메뉴 선택 시 작동할 내용 코딩)
순서대로 진행해 보겠습니다.
먼저 app/res 폴더에 menu라는 폴더를 생성해줍니다.
menu폴더가 만들어 졌으면 menu에 사용할 xml 파일을 만들어 줍니다.
menu1.xml 파일은 아래 처럼 작성 해보겠습니다.
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/item1"
android:title="item1" />
<item
android:id="@+id/item2"
android:title="item2" />
<item android:title="item3">
<menu>
<item
android:id="@+id/item4"
android:title="item4" />
<item
android:id="@+id/item5"
android:title="item5" />
</menu>
</item>
</menu>
위 코드에서 알 수 있는 점은 menu도 layout과 마찬가지로 nested구조로 사용 할 수 있다는 것입니다.
다시 말하자면 하나의 menu 의 아이템으로 다른 menu를 사용 할 수 있습니다.
activity_main.xml은 아래와 같이 쓰겠습니다.
<?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"
android:orientation="vertical"
android:id="@+id/baseLayout"
tools:context=".MainActivity">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="버튼"
android:layout_gravity="center"
android:layout_marginTop="200px"
android:id="@+id/button" />
</LinearLayout>
MainActivity.java의 onCreate() 안에 들어갈 registerForContextMenu()의 메서드의 기본 형태는 아래와 같습니다.
LinearLayout baseLayout;
Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
baseLayout = findViewById(R.id.baseLayout);
button = findViewById(R.id.button);
registerForContextMenu(button);
}
MainActivity.java에 들어갈 onCreateOptionMenu() 메서드의 기본 형식은 아래와 같습니다.
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
MenuInflater menuInflater = getMenuInflater();
if (v == 위젯1) {
menuInflater.inflate(R.menu.첫번째메뉴XML파일, menu);
}
if (v == 위젯2) {
menuInflater.inflate(R.menu.두번째메뉴XML파일, menu);
}
}
inflater라는 것은 정적으로 생성된 XML 파일을 Java에서 접근하여 실제 객체(동적)로 이용하기 위한 것이라고 생각하시면 됩니다. 혹은, 단순히 메뉴를 생성하기 위한, 연결하기 위한 중간자라고 생각하시면 됩니다.
MainActivity.java에 들어갈 onOptionsItemSelected() 메소드 기본 형식은 아래와 같습니다.
@Override
public boolean onContextItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.항목1아이디:
// 항목1을 선택했을때 실행할 코드
return true;
case R.id.항목2아이디:
// 항목2을 선택했을때 실행할 코드
return true;
}
return false;
}
위 내용들을 참고하여 MainActivity.java 는 아래와 같이 쓰겠습니다.
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
public class MainActivity extends AppCompatActivity {
LinearLayout baseLayout;
Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
baseLayout = findViewById(R.id.baseLayout);
button = findViewById(R.id.button);
registerForContextMenu(button);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
MenuInflater menuInflater = getMenuInflater();
if (v == button) {
menuInflater.inflate(R.menu.menu1, menu);
}
}
@Override
public boolean onContextItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.item1:
// 항목1을 선택했을때 실행할 코드
return true;
case R.id.item2:
// 항목2을 선택했을때 실행할 코드
return true;
case R.id.item4:
// 항목4을 선택했을때 실행할 코드
return true;
case R.id.item5:
// 항목5을 선택했을때 실행할 코드
return true;
}
return false;
}
}
실행 결과는 아래와 같습니다.
(버튼을 길게 눌려야 메뉴창이 나타납니다)
'컴퓨터 > 안드로이드' 카테고리의 다른 글
[안드로이드] 대화상자(Dialog) 사용하기 (0) | 2020.04.21 |
---|---|
[안드로이드] 토스트(toast) 메시지 사용하기 (0) | 2020.04.21 |
[안드로이드] xml을 이용해 옵션메뉴(OptionMenu) 사용하기 (0) | 2020.04.20 |
[안드로이드] 레이아웃(layout) #1 (0) | 2020.04.07 |
[안드로이드 스튜디오] eclipse 단축키 그대로 사용하는 방법 (0) | 2020.03.23 |