프로그래밍/안드로이드

안드로이드 - 실행 중에 메뉴 편집

가카리 2015. 8. 8. 00:34
반응형

메뉴가 열릴때마다 onPrepareOptionsMenu 메소드가 호출되는데 여기서 메뉴를 원하는대로 편집한다.

 

메뉴를 추가할 때는 add 메소드를 사용하며 삭제, 편집할 때는 다음 메소드를 호출한다.

 

void removeItem(int id)

void clear()

MenuItem findItem(int id)

MenuItem getItem(int index)

 

바로 실습에 들어가보자.

 

menu_modify.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"

tools:context="com.example.ch9_menu_modify.MenuModify" >

 

    <item android:id="@+id/submenu"

     android:title="Sub menu"

     >

     <menu>

     <group android:id="@+id/checkable_group"

     android:checkableBehavior="all">

     <item android:id="@+id/bigfont"

     android:title="BigFont"/>

     </group>

     <group android:id="@+id/exclusive_checkable_group"

     android:checkableBehavior="single">

     <item android:id="@+id/red"

     android:title="Red"

     android:checked="true"/>

     <item android:id="@+id/green"

     android:title="Green"/>

     <item android:id="@+id/blue"

     android:title="Blue"/>

     </group>

     </menu>

    </item>

</menu>

 

여기서 checkableBehavior 속성 중 all은 모든 항목을 개별적으로 선택할 수 있고 single은 한개만 선택할 수 있다는것을 의미한다.

 

다음은 화면의 버튼 한 개를 정의하기 위한

activity_menu_modify.xml 파일입니다.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"

android:orientation="vertical"

android:layout_width="match_parent"

android:layout_height="match_parent"

>

<Button

android:id="@+id/button"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:textColor="#ff0000"

android:text="Button"

android:textSize="20px"

/>

 

 

</LinearLayout>

 

다음은 MenuModify.java 파일입니다.

 

package com.example.ch9_menu_modify;

 

import android.app.Activity;

import android.graphics.Color;

import android.os.Bundle;

import android.util.TypedValue;

import android.view.Menu;

import android.view.MenuInflater;

import android.view.MenuItem;

import android.widget.Button;

 

public class MenuModify extends Activity {

 

    Button mBtn;

    

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_menu_modify);

        mBtn = (Button)findViewById(R.id.button);

    }

 

    @Override

    public boolean onCreateOptionsMenu(Menu menu) {

        super.onCreateOptionsMenu(menu);

        

        //XML 정의된 메뉴를 가져오기위해서 전개자를 선언합니다.

        MenuInflater inflater = getMenuInflater();

        

        //여기가 XML 이용해서 메뉴를 실제 정의하는 부분입니다.

        inflater.inflate(R.menu.menu_modify, menu);

        

        return true;

    }

 

    @Override

    public boolean onPrepareOptionsMenu(Menu menu) {

        

        //버튼의 텍스트 사이즈가 40이면

        if(mBtn.getTextSize()==40){

            menu.findItem(R.id.bigfont).setChecked(true);//체크해라

        }else{

            menu.findItem(R.id.bigfont).setChecked(false);

        }

        

        int color = mBtn.getTextColors().getDefaultColor();

        

        //각컬러 별로 체크를 하게됨

        if(color == Color.RED){

            menu.findItem(R.id.red).setChecked(true);

        }

        if(color == Color.GREEN){

            menu.findItem(R.id.green).setChecked(true);

        }

        if(color == Color.BLUE){

            menu.findItem(R.id.blue).setChecked(true);

        }

        

        return true;

    }

    

    @Override

    public boolean onOptionsItemSelected(MenuItem item) {

        

        //선택된 아이템 아이디를 가져와서 그에 맞는 행동을 여기서 정의한다.

        switch(item.getItemId()){

        case R.id.bigfont:

            //bigfontrk 체크되어있다면

            if(item.isChecked()){

                //체크를 풀게되므로 20으로 줄이고

                mBtn.setTextSize(TypedValue.COMPLEX_UNIT_PX, 20);

            }else{//체크를 하게되므로 40으로 늘림

                mBtn.setTextSize(TypedValue.COMPLEX_UNIT_PX, 40);

            }

            return true;

            // 색상별로 텍스트 색깔을 바꾸게됨

        case R.id.red:

            mBtn.setTextColor(Color.RED);

            return true;

        case R.id.green:

            mBtn.setTextColor(Color.GREEN);

            return true;

        case R.id.blue:

            mBtn.setTextColor(Color.BLUE);

            return true;

        }

        

        return true;

    }

}

 

 

다음은 실행화면입니다. 어떤 식으로 메뉴가 편집되는지 살펴봅시다.

현재 BigFont가 체크 해제되어있고 Red로 되있네요. 한번 Green을 눌러보죠

 

 

버튼색깔이 작게 녹색으로 바꼈네요. 다시 메뉴를 보면

 

 

Green으로 라디오 버튼이 선택되어 있음을 알 수 있습니다.

 

응용해서 다음처럼도 만들 수 있죠.

 

반응형