액션 프로바이더는 용도상으로 액션 뷰와 유사하지만 더 확장된 버젼이다.

 

ActionProvider클래스를 상속받아 작성하며 필수 메소드 몇가지를 재정의 해야 한다.

 

    View onCreateActionView([MenuItem forItem])

 

위의 메소드를 재정의하여 액션 뷰를 생성하여 리턴한다.

 

다음 메소드는 액션 뷰가 아닌 메뉴에 배치된 상태에서 메뉴를 선택할 때 호출된다.

 

    boolean onPerformDefaultAction()

 

메뉴 선택 시 이 메소드보다는 onOptionsItemSelected가 먼저 호출되는데 여기서 항목을 처리하지 않을 경우

 

onPerformDefaultAction 메소드가 대신 호출된다. 단 서브 메뉴가 있을 경우에는 이 메소드가 호출되지 않음.

 

이번 예제는 다음과 같이 구성합니다.

 

 

 

res/layout/counterprovider.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"

    android:orientation="horizontal"

     >

 

<TextView

android:id="@+id/count"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="10"/>

<Button

android:id="@+id/btnincrease"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="+"/>

<Button

android:id="@+id/btndecrease"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="-"/>

 

 

</LinearLayout>

 

ActionProviderTest.java

 

package com.example.ch21_actionprovider2;

 

import com.example.ch21_actionprovider2.R;

 

import android.app.Activity;

import android.content.Context;

import android.os.Bundle;

import android.view.ActionProvider;

import android.view.LayoutInflater;

import android.view.Menu;

import android.view.MenuInflater;

import android.view.MenuItem;

import android.view.View;

import android.widget.Button;

import android.widget.TextView;

import android.widget.Toast;

public class ActionProviderTest extends Activity {

 

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        

        TextView text = new TextView(this);

        text.setText("액션 프로바이더를 테스트합니다.");

        setContentView(text);

        

    }

 

    @Override

    public boolean onCreateOptionsMenu(Menu menu) {

        super.onCreateOptionsMenu(menu);

        MenuInflater inflater = getMenuInflater();

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

        

        return true;

    }

 

    @Override

    public boolean onOptionsItemSelected(MenuItem item) {

        Toast.makeText(this, "Counter Menu Item selected", 0).show();

        

        return true;

    }

 

    //액션 프로바이더를 위한 클래스

    public static class CounterProvider extends ActionProvider{

        Context mContext;

        TextView mCountText;

        

        public CounterProvider(Context context){

            super(context);

            mContext = context;

        }

        

        //

        public View onCreateActionView(){

            LayoutInflater Inflater = LayoutInflater.from(mContext);

            //xml 전개자로 가져와서 뿌려줌

            View linear = Inflater.inflate(R.layout.counterprovider, null);

            mCountText = (TextView)linear.findViewById(R.id.count);

            

            //버튼 리스너 달아줌

            Button btnInc = (Button)linear.findViewById(R.id.btnincrease);

            btnInc.setOnClickListener(new View.OnClickListener() {

                

                @Override

                public void onClick(View v) {

                    // TODO Auto-generated method stub

                    //클릭시 값이 1 증가함

                    int count = Integer.parseInt(mCountText.getText().toString());

                    mCountText.setText(Integer.toString(count + 1));

                }

            });

            

            Button btnDec = (Button)linear.findViewById(R.id.btndecrease);

            btnDec.setOnClickListener(new View.OnClickListener() {

                

                @Override

                public void onClick(View v) {

                    //클릭시 값이 1 감소함

                    // TODO Auto-generated method stub

                    int count = Integer.parseInt(mCountText.getText().toString());

                    mCountText.setText(Integer.toString(count - 1));

                }

            });

            return linear;

        }

        

        public boolean onPerformDefaultAction(){

            Toast.makeText(mContext, "Counter Menu Item selected -", 0).show();

            return true;

        }

    }

 

}

 

res/menu/actionprovidermenu.xml

 

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

>

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

android:title="Counter"

android:showAsAction="always"

android:actionProviderClass="com.example.ch21_actionprovider2.ActionProviderTest$CounterProvider"

/>

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

android:title="Counter"

android:showAsAction="never"

android:actionProviderClass="com.example.ch21_actionprovider2.ActionProviderTest$CounterProvider"

/>

</menu>

 

 

실행 화면

버튼을 누를 때마다 값이 증가하거나 감소한다.

 

블로그 이미지

가카리

프로그래밍, 취업 및 직장생활, 주식 부동산 재테크 전문 블로그

댓글을 달아 주세요