mojo's Blog

메뉴 본문

Android

메뉴

_mojo_ 2021. 8. 30. 14:00

안드로이드에서 메뉴는 옵션 메뉴(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
Comments