액션 프로바이더는 용도상으로 액션 뷰와 유사하지만 더 확장된 버젼이다.
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>
실행 화면
버튼을 누를 때마다 값이 증가하거나 감소한다.
'프로그래밍 > 안드로이드' 카테고리의 다른 글
안드로이드 - DialogFragment 로 대화상자 만들기 (0) | 2015.10.11 |
---|---|
안드로이드 - 내비게이션 탭(Navigation Tab) (0) | 2015.10.04 |
[펌자료] 안드로이드 - 액티비티의 상태를 저장 및 복원하는 콜백 메소드 - onSaveInstanceState, onRestoreInstanceState (0) | 2015.10.04 |
안드로이드 - ShareActionProvider를 이용한 앱간 데이터 공유 처리하기 (0) | 2015.10.04 |
안드로이드 - 프래그먼트를 이용한 간단한 사전 만들기 (0) | 2015.09.21 |
안드로이드 - 액션바의 활용 첫번째 SeachView (0) | 2015.09.20 |
안드로이드 - 앱 로고 아이콘 (0) | 2015.09.20 |
안드로이드 - 액션바 숨기기 및 보이기 (0) | 2015.09.20 |