프로그래밍/안드로이드

안드로이드 - 액션 모드(ActionMode) 다루기

가카리 2015. 10. 25. 17:26
반응형

 

액션 모드는 특정 상황에 임시적으로 열리는 액션바다. (에디트 텍스트를 길게 누른다던지.._

 

액션 모드는 이전에 컨텍스트 메뉴를 대체하는 장치이다.

 

액션 모드는 액티비티의 다음 메소드로 시작한다.

 

    ActionMode startActionMode(ActionMode.Callback callback)

 

인수로 액션 모드의 메뉴를 관리하는 콜백 객체를 요구하며 생성된 액션 모드 객체를 리턴한다. 콜백 인터페이스의 메소드는 옵션 메뉴의 콜백과 유사하다.

 

    boolean onCreateActionMode(ActionMode mode, Menu menu)

    boolean onPrepareActionMode(ActionMode mode, Menu menu)

    boolean onActionItemClicked(ActionMode mode, MenuItem item)

    void onDestroyActionMode(ActionMode mode)

 

메뉴의 생성, 준비, 선택, 파괴 시에 각 콜백이 호출된다. 액티비티에 정의된 메뉴 관련 콜백과 거의 비슷하지만 인수로 ActionMode를 받는다는 점이 다르다.

 

다음은 버튼을 누르면 액션 모드를 보여주는 예제이다.

 

예제 구성

 

 

actionmodetestmenu.xml

 

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

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

tools:context="com.example.ch21_actionmodetest.ActionModeTest" >

 

<item

android:id="@+id/add"

android:title="add"

android:icon="@android:drawable/ic_menu_add"

android:showAsAction="always|withText"

/>

<item

android:id="@+id/edit"

android:title="edit"

android:icon="@android:drawable/ic_menu_edit"

android:showAsAction="always|withText"

/>

<item

android:id="@+id/search"

android:title="search"

android:icon="@android:drawable/ic_menu_search"

android:showAsAction="always|withText"

/>

 

</menu>

 

 

actionmodetest.xml

 

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

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

    android:layout_width="match_parent"

    android:layout_height="match_parent"

>

 

<Button

android:id="@+id/btnaction"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:onClick="mOnClick"

android:text="Action Mode"

/>

 

</LinearLayout>

 

 

ActionModeTest.java

 

package com.example.ch21_actionmodetest;

 

import android.app.Activity;

import android.os.Bundle;

import android.view.ActionMode;

import android.view.Menu;

import android.view.MenuInflater;

import android.view.MenuItem;

import android.view.View;

import android.widget.Toast;

 

public class ActionModeTest extends Activity {

    ActionMode mActionMode;

    

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.actionmodetest);

    }

 

    public void mOnClick(View v){

        switch(v.getId()){

        case R.id.btnaction:

            //버튼 클릭시 액션 모드가 실행된다.

            if(mActionMode == null){

                mActionMode = startActionMode(mActionCallback);

                mActionMode.setTitle("Test");

            }

            break;

        }

    }

    

    ActionMode.Callback mActionCallback = new ActionMode.Callback() {

        

        @Override

        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {

            // TODO Auto-generated method stub

            return false;

        }

        

        @Override

        public void onDestroyActionMode(ActionMode mode) {

            // TODO Auto-generated method stub

            //액션 모드가 끝나면 mActionMode 해지한다.

            mActionMode = null;

        }

        

        @Override

        public boolean onCreateActionMode(ActionMode mode, Menu menu) {

            // TODO Auto-generated method stub

            //액션 모드 메뉴를 생성해주는 부분

            MenuInflater inflater = mode.getMenuInflater();

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

            

            return true;

        }

        

        @Override

        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {

            // TODO Auto-generated method stub

            //액션 모드의 아이템이 클릭됬을때 처리는 여기서

            switch(item.getItemId()){

            case R.id.add:

                Toast.makeText(ActionModeTest.this, "add", 0).show();

                break;

            case R.id.edit:

                Toast.makeText(ActionModeTest.this, "edit", 0).show();

                break;

            case R.id.search:

                Toast.makeText(ActionModeTest.this, "search", 0).show();

                break;

            }

            

            return false;

        }

    };

    

}

 

 

실행 화면

 

 

버튼을 누르면 다음과 같이 뜬다

 

연필 모양 클릭시 토스트 메시지가 나온다.