mojo's Blog
메뉴 본문
안드로이드에서 메뉴는 옵션 메뉴(operation Menu), 컨텍스트 메뉴(context Menu) 로 구분한다.
메뉴 XML 파일을 이용하는 방식은 다음 세 가지만 설정하면 된다.
1. 메뉴 폴더 생성 및 메뉴 XML 파일 생성, 편집
2. Java coding : onCreateOptionMenu() 메소드 오버라이딩
3. Java coding : onOptionItemSelected() 메소드 오버라이딩
XML 파일은 다음과 같은 형식을 갖는다.
<menu>
<item
android:id="@+id/항목1아이디"
android:title="항목1 제목"/>
<item
android:id="@+id/항목2아이디"
android:title="항목2 제목"/>
</menu>
onCreateOptionsMenu() 메소드 구현
public boolean onCreateOptionsMenu(Menu menu){
super.onCreateOptionsMenu(menu);
MenuInflater mInflater = getMenuInflater();
mInflater.inflate(R.menu.메뉴XML아이디, menu);
return true;
}
이때, '메뉴XML아이디' 는 화면에 보여줄 메뉴 XML 파일의 id로 바꿔준다.
onOptionsItemSelected() 메소드 구현
public boolean onOptionsItemSelected(MenuItem item){
switch(item.getItemId()){
case R.id.항목1아이디:
// 구현
return true;
case R.id.항목2아이디:
// 구현
return true;
}
return false;
}
메뉴는 항목이 여러 개 나오기 때문에 보통 메소드 내부에서 switch() 문을 사용한다.
Inflater
안드로이드에서 사용되는 Inflater 란 정적으로 존재하는 XML 파일을 Java code 에서 접근하여 실제 객체로 만들어서 사용하는 것이라고 볼 수 있다.
Menu Inflater 객체는 메뉴 XML 파일을 Java code 에서 가져와 사용하는 것이고, Layout Inflater 는 레이아웃 XML 파일을 Java code 에서 가져와서 사용하는 것이다.
연습 ) 배경색 변경 앱 만들어보기
activity_main.xml Code
<?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">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="오른쪽 위 메뉴 버튼을 누르세요"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="이건 버튼"
android:id="@+id/btn1"
android:layout_margin="15dp"
android:layout_gravity="center"/>
</LinearLayout>
menu1.xml Code
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/itemRed"
android:title="배경색(빨강)"/>
<item
android:id="@+id/itemGreen"
android:title="배경색(초록)"/>
<item
android:id="@+id/itemBlue"
android:title="배경색(파랑)"/>
<item
android:title="버튼 변경 >> ">
<menu>
<item
android:id="@+id/subRotate"
android:title="버튼 45도 회전"/>
<item
android:id="@+id/subSize"
android:title="버튼 2배 확대" />
</menu>
</item>
</menu>
Java Code
public class MainActivity extends AppCompatActivity {
LinearLayout baseLayout;
Button btn1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setTitle("배경색 바꾸기");
baseLayout = (LinearLayout)findViewById(R.id.baseLayout);
btn1 = (Button)findViewById(R.id.btn1);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
MenuInflater mInflater = getMenuInflater();
mInflater.inflate(R.menu.menu1,menu);
return true;
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch(item.getItemId()){
case R.id.itemRed:
baseLayout.setBackgroundColor(Color.RED);
return true;
case R.id.itemGreen:
baseLayout.setBackgroundColor(Color.GREEN);
return true;
case R.id.itemBlue:
baseLayout.setBackgroundColor(Color.BLUE);
return true;
case R.id.subRotate:
btn1.setRotation(45);
return true;
case R.id.subSize:
btn1.setScaleX(2);
return true;
}
return false;
}
}
Java Code에서 Inflater 를 사용하지 않고 직접 menu에 add하여 만든 Code
public class MainActivity extends AppCompatActivity {
LinearLayout baseLayout;
Button btn1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setTitle("배경색 바꾸기");
baseLayout = (LinearLayout)findViewById(R.id.baseLayout);
btn1 = (Button)findViewById(R.id.btn1);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
menu.add(0,1,0,"배경색(빨강)");
menu.add(0,2,0,"배경색(초록)");
menu.add(0,3,0,"배경색(파랑)");
SubMenu sMenu = menu.addSubMenu("버튼 변경 >>");
sMenu.add(0,4,0,"버튼 45도 회전");
sMenu.add(0,5,0,"버튼 2배 확대");
return true;
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch(item.getItemId()){
case 1:
baseLayout.setBackgroundColor(Color.RED);
return true;
case 2:
baseLayout.setBackgroundColor(Color.GREEN);
return true;
case 3:
baseLayout.setBackgroundColor(Color.BLUE);
return true;
case 4:
btn1.setRotation(45);
return true;
case 5:
btn1.setScaleX(2);
return true;
}
return false;
}
}
연습 ) 다음과 같은 메뉴를 만들어 보기
activity_main.xml Code
<?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">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:text="각도 입력"/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:hint="여기를 입력하세요."
android:id="@+id/edit1"/>
</LinearLayout>
<ImageView
android:layout_width="300dp"
android:layout_height="300dp"
android:scaleType="fitCenter"
android:layout_gravity="center"
android:id="@+id/img1"/>
</LinearLayout>
menu1.xml Code
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/itemRotation"
android:title="그림 회전"/>
<group
android:checkableBehavior="single">
<item
android:id="@+id/itemCat"
android:title="고양이"/>
<item
android:id="@+id/itemLion"
android:title="라이언"/>
<item
android:id="@+id/itemRabbit"
android:title="토끼"/>
</group>
</menu>
Java Code
public class MainActivity extends AppCompatActivity {
EditText edit;
ImageView img;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setTitle("연습하기");
edit = (EditText)findViewById(R.id.edit1);
img = (ImageView)findViewById(R.id.img1);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
MenuInflater mInflater = getMenuInflater();
mInflater.inflate(R.menu.menu1, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch(item.getItemId()){
case R.id.itemRotation:
img.setRotation(Integer.parseInt(edit.getText().toString()));
break;
case R.id.itemCat:
img.setImageResource(R.drawable.cat);
break;
case R.id.itemLion:
img.setImageResource(R.drawable.lion);
break;
case R.id.itemRabbit:
img.setImageResource(R.drawable.rabbit);
break;
}
return false;
}
}
XML을 이용한 Context Menu
이전에 한 Option Menu는 키패드의 메뉴 버튼을 누를 때 나타났다.
Context Menu 는 레이아웃 or 버튼, 에디트텍스트 등의 widget 을 롱클릭할 때 화면 중앙에 나타나며, Windows 팝업 창과 비슷하다.
구현하는 방법은 4단계로 다음과 같다.
1. 메뉴 폴더 생성 및 위젯의 메뉴 XML 파일 생성, 편집
2. Java Coding : onCreate() 안에 registerForContextMenu() 로 등록
3. Java Coding : onCreateContextMenu() 메소드 오버라이딩
4. Java Coding : onContextItemSelected() 메소드 오버라이딩
연습 ) 배경색을 변경하고 버튼을 변경하는 앱 만들어 보기
activity_main.xml Code
<?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:gravity="center_horizontal"
android:id="@+id/baseLayout">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/btn1"
android:text="배경색 변경"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/btn2"
android:text="버튼 변경"/>
</LinearLayout>
menu1.xml Code
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/itemRed"
android:title="배경색(빨강)"/>
<item
android:id="@+id/itemGreen"
android:title="배경색(초록)"/>
<item
android:id="@+id/itemBlue"
android:title="배경색(파랑)"/>
</menu>
menu2.xml Code
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/subRotate"
android:title="버튼 45도 회전"/>
<item
android:id="@+id/subSize"
android:title="버튼 2개 확대"/>
</menu>
Java Code
public class MainActivity extends Activity {
LinearLayout baseLayout;
Button btn1,btn2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setTitle("연습하기");
baseLayout = (LinearLayout)findViewById(R.id.baseLayout);
btn1 = (Button)findViewById(R.id.btn1);
registerForContextMenu(btn1);
btn2 = (Button)findViewById(R.id.btn2);
registerForContextMenu(btn2);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
MenuInflater mInflater = getMenuInflater();
Toast.makeText(getApplicationContext(),"실행댐222222",Toast.LENGTH_SHORT).show();
if(v == btn1){
Toast.makeText(getApplicationContext(),"실행댐",Toast.LENGTH_SHORT).show();
menu.setHeaderTitle("배경색 변경");
mInflater.inflate(R.menu.menu1, menu);
}
if(v == btn2){
mInflater.inflate(R.menu.menu2, menu);
}
}
@Override
public boolean onContextItemSelected(@NonNull MenuItem item) {
switch(item.getItemId()){
case R.id.itemRed:
baseLayout.setBackgroundColor(Color.RED);
return true;
case R.id.itemGreen:
baseLayout.setBackgroundColor(Color.GREEN);
return true;
case R.id.itemBlue:
baseLayout.setBackgroundColor(Color.BLUE);
return true;
case R.id.subRotate:
btn2.setRotation(45);
return true;
case R.id.subSize:
btn2.setScaleX(2);
return true;
}
return false;
}
}
'Android' 카테고리의 다른 글
안드로이드 프로그래밍 제 7장 연습문제 (4, 5, 6번) (0) | 2021.08.30 |
---|---|
대화상자 (0) | 2021.08.30 |
안드로이드 프로그래밍 제 6장 연습문제 6번 (0) | 2021.08.29 |
View Container (0) | 2021.08.29 |
고급 위젯 / 기타 위젯 (0) | 2021.08.28 |