我要寻找使用点击搜索视图QuickAction对话框。下面是形象展示我所期待的:
没有任何人有一个样品或链接显示了如何实现这一目标?
另外,我怎么能打破两部分行动迅速对话框?目前,它是这个样子:
像:
|检查检查检查检查|
我想用这种方式:
|检查检查|
|检查检查|
|好|
下面是我的code:
QuickAction.java
公共类QuickAction扩展PopupWindows实现OnDismissListener {
私人查看mRootView;
私人ImageView的mArrowUp;
私人ImageView的mArrowDown;
私人复选框检查;
私人LayoutInflater mInflater;
私人的ViewGroup mTrack;
私人滚动型mScroller;
私人OnActionItemClickListener mItemClickListener;
私人OnDismissListener mDismissListener;
私人列表< ActionItem> actionItems =新的ArrayList< ActionItem>();
私人布尔mDidAction;
私人诠释mChildPos;
私人诠释mInsertPos;
私人诠释mAnimStyle;
私人诠释mOrientation;
私人诠释rootWidth = 0;
公共静态最终诠释水平= 0;
公共静态最终诠释垂直= 1;
公共静态最终诠释ANIM_GROW_FROM_LEFT = 1;
公共静态最终诠释ANIM_GROW_FROM_RIGHT = 2;
公共静态最终诠释ANIM_GROW_FROM_CENTER = 3;
公共静态最终诠释ANIM_REFLECT = 4;
公共静态最终诠释ANIM_AUTO = 5;
/ **
*构造默认的垂直布局
*
* @参数方面上下文
* /
公共QuickAction(上下文的背景下){
这(背景下,垂直);
}
/ **
*构造允许定向覆盖
*
* @参数方面上下文
*参数方向的布局方向,可以vartical或水平
* /
公共QuickAction(上下文的背景下,INT方向){
超(上下文);
mOrientation =方向;
mInflater =(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
如果(mOrientation ==水平){
setRootViewId(R.layout.popup_horizontal);
} 其他 {
setRootViewId(R.layout.popup_vertical);
}
mAnimStyle = ANIM_AUTO;
mChildPos = 0;
}
/ **
*获取行动项目索引
*
*项目@参数指标指数(位置从回调)
*
* @返回行动项目的位置
* /
公共ActionItem getActionItem(INT指数){
返回actionItems.get(指数);
}
/ **
*设置根视图。
*
*参数标识布局资源ID
* /
公共无效setRootViewId(INT ID){
mRootView =(ViewGroup中)mInflater.inflate(ID,NULL);
mTrack =(ViewGroup中)mRootView.findViewById(R.id.tracks);
mArrowDown =(ImageView的)mRootView.findViewById(R.id.arrow_down);
mArrowUp =(ImageView的)mRootView.findViewById(R.id.arrow_up);
mScroller =(滚动型)mRootView.findViewById(R.id.scroller);
//这是$ P $展出pviously定义()方法,搬到这里prevent强制关闭的发生
//在视图快速度攻何时显示quickaction对话框。
//感谢名单,以zammbi(github.com/zammbi)
mRootView.setLayoutParams(新的LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));
的setContentView(mRootView);
}
/ **
*设置动画风格
*
*参数mAnimStyle动画风格,默认设置为ANIM_AUTO
* /
公共无效setAnimStyle(INT mAnimStyle){
this.mAnimStyle = mAnimStyle;
}
/ **
*设置监听器操作项点击。
*
* @参数监听器监听器
* /
公共无效setOnActionItemClickListener(OnActionItemClickListener监听器){
mItemClickListener =侦听器;
}
/ **
*添加行动项目
*
*参数动作{@link ActionItem}
* /
公共无效addActionItem(ActionItem动作){
actionItems.add(动作);
字符串标题= action.getTitle();
可绘制图标= action.getIcon();
View容器;
如果(mOrientation ==水平){
容器= mInflater.inflate(R.layout.action_item_horizontal,NULL);
} 其他 {
容器= mInflater.inflate(R.layout.action_item_vertical,NULL);
}
// ImageView的IMG =(ImageView的)container.findViewById(R.id.iv_icon);
复选框检查=(复选框)container.findViewById(R.id.checkBox1);
check.setText(职称);
// TextView的文字=(TextView的)container.findViewById(R.id.tv_title);
/ *
如果(图标!= NULL){
img.setImageDrawable(图标);
} 其他 {
img.setVisibility(View.GONE);
} * /
/ *
如果(标题!= NULL){
text.setText(职称);
} 其他 {
text.setVisibility(View.GONE);
}
* /
最终诠释POS = mChildPos;
最终诠释actionId = action.getActionId();
container.setOnClickListener(新OnClickListener(){
@覆盖
公共无效的onClick(视图v){
如果(mItemClickListener!= NULL){
mItemClickListener.onItemClick(QuickAction.this,POS,actionId);
}
如果(!getActionItem(正).isSticky()){
mDidAction = TRUE;
解雇();
}
}
});
container.setFocusable(真正的);
container.setClickable(真正的);
/ *如果(mOrientation ==水平和放大器;&安培;!mChildPos = 0){
浏览器= mInflater.inflate(R.layout.horiz_separator,NULL);
RelativeLayout.LayoutParams PARAMS =新RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.FILL_PARENT);
separator.setLayoutParams(PARAMS);
separator.setPadding(5,0,5,0);
mTrack.addView(分隔符,mInsertPos);
Log.i(mInsertPos,mInsertPos 1 - >中+ mInsertPos);
mInsertPos ++;
} * /
Log.i(mInsertPos,mInsertPos 2 - >中+ mInsertPos);
mTrack.addView(集装箱,mInsertPos);
mInsertPos ++;
mChildPos ++;
Log.i(mChildPos,mChildPos 1 - >中+ mChildPos);
Log.i(mInsertPos,mInsertPos 3 - >中+ mInsertPos);
}
/ **
*显示quickaction弹出。弹出自动定位,在顶部或锚视图底部。
*
* /
公共无效展(查看锚){
preShow();
INT XPOS,yPos,arrowPos;
mDidAction = FALSE;
INT []的位置=新INT [2];
anchor.getLocationOnScreen(位置);
矩形anchorRect =新的矩形(位置[0],位置[1],位置[0] + anchor.getWidth(),位置[1]
+ anchor.getHeight());
//mRootView.setLayoutParams(new的LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));
mRootView.measure(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
INT rootHeight = mRootView.getMeasuredHeight();
如果(rootWidth == 0){
rootWidth = mRootView.getMeasuredWidth();
}
INT屏幕宽度= mWindowManager.getDefaultDisplay()的getWidth()。
INT screenHeight = mWindowManager.getDefaultDisplay()的getHeight()。
//自动获得弹出第X坐标(左上)
如果((anchorRect.left + rootWidth)>屏幕宽度){
XPOS = anchorRect.left - (rootWidth-anchor.getWidth());
XPOS =(XPOS℃,)? 0:XPOS;
arrowPos = anchorRect.centerX() - XPOS;
} 其他 {
如果(anchor.getWidth()> rootWidth){
XPOS = anchorRect.centerX() - (rootWidth / 2);
} 其他 {
XPOS = anchorRect.left;
}
arrowPos = anchorRect.centerX() - XPOS;
}
INT dyTop = anchorRect.top;
INT dyBottom = screenHeight - anchorRect.bottom;
布尔onTop =(dyTop> dyBottom)?真假;
如果(onTop){
如果(rootHeight> dyTop){
yPos = 15;
的LayoutParams升= mScroller.getLayoutParams();
l.height = dyTop - anchor.getHeight();
} 其他 {
yPos = anchorRect.top - rootHeight;
}
} 其他 {
yPos = anchorRect.bottom;
如果(rootHeight> dyBottom){
的LayoutParams升= mScroller.getLayoutParams();
l.height = dyBottom;
}
}
showArrow(((onTop)R.id.arrow_down:R.id.arrow_up),arrowPos);
setAnimationStyle(屏幕宽度,anchorRect.centerX(),onTop);
mWindow.showAtLocation(锚,Gravity.NO_GRAVITY,XPOS,yPos);
}
/ **
*设置动画风格
*
*参数屏幕宽度屏幕宽度
*参数requestedX从左侧边缘的距离
* @参数onTop标志,以指示应显示在弹出。如果显示的锚视图顶部设置为TRUE
*反之亦然
* /
私人无效setAnimationStyle(INT屏幕宽度,诠释requestedX,布尔onTop){
INT arrowPos = requestedX - mArrowUp.getMeasuredWidth()/ 2;
开关(mAnimStyle){
案例ANIM_GROW_FROM_LEFT:
mWindow.setAnimationStyle((onTop)R.style.Animations_PopUpMenu_Left:R.style.Animations_PopDownMenu_Left);
打破;
案例ANIM_GROW_FROM_RIGHT:
mWindow.setAnimationStyle((onTop)R.style.Animations_PopUpMenu_Right:R.style.Animations_PopDownMenu_Right);
打破;
案例ANIM_GROW_FROM_CENTER:
mWindow.setAnimationStyle((onTop)R.style.Animations_PopUpMenu_Center:R.style.Animations_PopDownMenu_Center);
打破;
案例ANIM_REFLECT:
mWindow.setAnimationStyle((onTop)R.style.Animations_PopUpMenu_Reflect:R.style.Animations_PopDownMenu_Reflect);
打破;
案例ANIM_AUTO:
如果(arrowPos< =屏幕宽度/ 4){
mWindow.setAnimationStyle((onTop)R.style.Animations_PopUpMenu_Left:R.style.Animations_PopDownMenu_Left);
}否则如果(arrowPos>屏幕宽度/ 4和&安培; arrowPos 3; *(屏幕宽度/ 4)){
mWindow.setAnimationStyle((onTop)R.style.Animations_PopUpMenu_Center:R.style.Animations_PopDownMenu_Center);
} 其他 {
mWindow.setAnimationStyle((onTop)R.style.Animations_PopUpMenu_Right:R.style.Animations_PopDownMenu_Right);
}
打破;
}
}
/ **
*显示箭头
*
*参数whichArrow箭头类型的资源ID
*从屏幕左侧@param requestedX距离
* /
私人无效showArrow(INT whichArrow,诠释requestedX){
最后查看showArrow =(whichArrow == R.id.arrow_up)? mArrowUp:mArrowDown;
最后查看hideArrow =(whichArrow == R.id.arrow_up)? mArrowDown:mArrowUp;
最终诠释arrowWidth = mArrowUp.getMeasuredWidth();
showArrow.setVisibility(View.VISIBLE);
ViewGroup.MarginLayoutParams参数=(ViewGroup.MarginLayoutParams)showArrow.getLayoutParams();
param.leftMargin = requestedX - arrowWidth / 2;
hideArrow.setVisibility(View.INVISIBLE);
}
/ **
*设置监听窗口驳回。如果被驳回的quicakction对话框该监听器将只被解雇
*通过点击该对话框之外或点击粘项目。
* /
公共无效setOnDismissListener(QuickAction.OnDismissListener监听器){
setOnDismissListener(本);
mDismissListener =侦听器;
}
@覆盖
公共无效onDismiss(){
如果(mDidAction&安培;!&安培;!mDismissListener = NULL){
mDismissListener.onDismiss();
}
}
/ **
*监听器项目点击
*
* /
公共接口OnActionItemClickListener {
公共抽象无效onItemClick(QuickAction源,诠释POS,INT actionId);
}
/ **
*监听器窗口驳回
*
* /
公共接口OnDismissListener {
公共抽象无效onDismiss();
}
}
ExampleActivity.java
公共类为ExampleActivity延伸活动{
//动作ID
私有静态最终诠释ID_UP = 1;
私有静态最终诠释ID_DOWN = 1;
私有静态最终诠释ID_SEARCH = 3;
私有静态最终诠释ID_INFO = 4;
私有静态最终诠释ID_ERASE = 5;
私有静态最终诠释ID_OK = 6;
@覆盖
公共无效的onCreate(包savedInstanceState){
super.onCreate(savedInstanceState);
的setContentView(R.layout.main);
ActionItem nextItem =新ActionItem(ID_DOWN,通过MRN);
ActionItem prevItem =新ActionItem(ID_UP,按日期);
ActionItem searchItem =新ActionItem(2,由NAME);
ActionItem infoItem =新ActionItem(2,按位置);
ActionItem okItem =新ActionItem(3,OK);
//使用setSticky(真)来禁止被解雇QuickAction对话框中单击某项后,
prevItem.setSticky(真正的);
nextItem.setSticky(真正的);
searchItem.setSticky(真正的);
infoItem.setSticky(真正的);
//创建QuickAction。使用QuickAction.VERTICAL或QuickAction.HORIZONTAL参数来定义布局
//方向
最后QuickAction quickAction =新QuickAction(这一点,QuickAction.VERTICAL);
//添加行动项目进入QuickAction
quickAction.addActionItem(nextItem);
的System.out.println(nextItem);
quickAction.addActionItem(prevItem);
的System.out.println(prevItem);
quickAction.addActionItem(searchItem);
的System.out.println(searchItem);
quickAction.addActionItem(infoItem);
的System.out.println(infoItem);
quickAction.addActionItem(okItem);
的System.out.println(okItem);
//设置监听器操作项点击
quickAction.setOnActionItemClickListener(新QuickAction.OnActionItemClickListener(){
@覆盖
公共无效onItemClick(QuickAction源,诠释POS,INT actionId){
ActionItem actionItem = quickAction.getActionItem(POS);
//这里我们可以过滤哪些行动项目被点击与POS机或actionId参数
/ *如果(actionId == ID_SEARCH){
Toast.makeText(getApplicationContext(),让我们做一些搜索行动,Toast.LENGTH_SHORT).show();
}否则,如果(actionId == ID_INFO){
Toast.makeText(getApplicationContext(),我没有信息这一次,Toast.LENGTH_SHORT).show();
} 其他 {*/
Toast.makeText(getApplicationContext(),actionItem.getTitle()+选择,Toast.LENGTH_SHORT).show();
//}
}
});
关于解雇事件//设置listnener,这个监听器将只称为如果被驳回QuickAction对话框
//通过单击对话框以外的区域。
quickAction.setOnDismissListener(新QuickAction.OnDismissListener(){
@覆盖
公共无效onDismiss(){
Toast.makeText(getApplicationContext(),驳回,Toast.LENGTH_SHORT).show();
}
});
//秀BTN1
按钮BTN1 =(按钮)this.findViewById(R.id.btn1);
btn1.setOnClickListener(新View.OnClickListener(){
@覆盖
公共无效的onClick(视图v){
quickAction.show(五);
}
});
按钮BTN2 =(按钮)this.findViewById(R.id.btn2);
btn2.setOnClickListener(新OnClickListener(){
@覆盖
公共无效的onClick(视图v){
quickAction.show(五);
}
});
/ *按钮btn3 =(按钮)this.findViewById(R.id.btn3);
btn3.setOnClickListener(新OnClickListener(){
@覆盖
公共无效的onClick(视图v){
quickAction.show(五);
quickAction.setAnimStyle(QuickAction.ANIM_REFLECT);
}
}); * /
}
}
解决方案
快速操作对话框采样给出一个网站上:
快速操作对话框样品
I am looking for a QuickAction dialog using onclick search view. Here is image showing what I am looking for:
Does anybody have a sample or link showing how to achieve this?
Also, how can I break the Quick action dialog in two parts? Currently it is shown like this:
Like:
| check check check check |
I want in this way:
| check check |
| check check |
| Ok |
Here is my code:
QuickAction.java
public class QuickAction extends PopupWindows implements OnDismissListener {
private View mRootView;
private ImageView mArrowUp;
private ImageView mArrowDown;
private CheckBox check;
private LayoutInflater mInflater;
private ViewGroup mTrack;
private ScrollView mScroller;
private OnActionItemClickListener mItemClickListener;
private OnDismissListener mDismissListener;
private List<ActionItem> actionItems = new ArrayList<ActionItem>();
private boolean mDidAction;
private int mChildPos;
private int mInsertPos;
private int mAnimStyle;
private int mOrientation;
private int rootWidth=0;
public static final int HORIZONTAL = 0;
public static final int VERTICAL = 1;
public static final int ANIM_GROW_FROM_LEFT = 1;
public static final int ANIM_GROW_FROM_RIGHT = 2;
public static final int ANIM_GROW_FROM_CENTER = 3;
public static final int ANIM_REFLECT = 4;
public static final int ANIM_AUTO = 5;
/**
* Constructor for default vertical layout
*
* @param context Context
*/
public QuickAction(Context context) {
this(context, VERTICAL);
}
/**
* Constructor allowing orientation override
*
* @param context Context
* @param orientation Layout orientation, can be vartical or horizontal
*/
public QuickAction(Context context, int orientation) {
super(context);
mOrientation = orientation;
mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (mOrientation == HORIZONTAL) {
setRootViewId(R.layout.popup_horizontal);
} else {
setRootViewId(R.layout.popup_vertical);
}
mAnimStyle = ANIM_AUTO;
mChildPos = 0;
}
/**
* Get action item at an index
*
* @param index Index of item (position from callback)
*
* @return Action Item at the position
*/
public ActionItem getActionItem(int index) {
return actionItems.get(index);
}
/**
* Set root view.
*
* @param id Layout resource id
*/
public void setRootViewId(int id) {
mRootView = (ViewGroup) mInflater.inflate(id, null);
mTrack = (ViewGroup) mRootView.findViewById(R.id.tracks);
mArrowDown = (ImageView) mRootView.findViewById(R.id.arrow_down);
mArrowUp = (ImageView) mRootView.findViewById(R.id.arrow_up);
mScroller = (ScrollView) mRootView.findViewById(R.id.scroller);
//This was previously defined on show() method, moved here to prevent force close that occured
//when tapping fastly on a view to show quickaction dialog.
//Thanx to zammbi (github.com/zammbi)
mRootView.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
setContentView(mRootView);
}
/**
* Set animation style
*
* @param mAnimStyle animation style, default is set to ANIM_AUTO
*/
public void setAnimStyle(int mAnimStyle) {
this.mAnimStyle = mAnimStyle;
}
/**
* Set listener for action item clicked.
*
* @param listener Listener
*/
public void setOnActionItemClickListener(OnActionItemClickListener listener) {
mItemClickListener = listener;
}
/**
* Add action item
*
* @param action {@link ActionItem}
*/
public void addActionItem(ActionItem action) {
actionItems.add(action);
String title = action.getTitle();
Drawable icon = action.getIcon();
View container;
if (mOrientation == HORIZONTAL) {
container = mInflater.inflate(R.layout.action_item_horizontal, null);
} else {
container = mInflater.inflate(R.layout.action_item_vertical, null);
}
//ImageView img = (ImageView) container.findViewById(R.id.iv_icon);
CheckBox check = (CheckBox) container.findViewById(R.id.checkBox1);
check.setText(title);
//TextView text = (TextView) container.findViewById(R.id.tv_title);
/*
if (icon != null) {
img.setImageDrawable(icon);
} else {
img.setVisibility(View.GONE);
}*/
/*
if (title != null) {
text.setText(title);
} else {
text.setVisibility(View.GONE);
}
*/
final int pos = mChildPos;
final int actionId = action.getActionId();
container.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (mItemClickListener != null) {
mItemClickListener.onItemClick(QuickAction.this, pos, actionId);
}
if (!getActionItem(pos).isSticky()) {
mDidAction = true;
dismiss();
}
}
});
container.setFocusable(true);
container.setClickable(true);
/* if (mOrientation == HORIZONTAL && mChildPos != 0) {
View separator = mInflater.inflate(R.layout.horiz_separator, null);
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.FILL_PARENT);
separator.setLayoutParams(params);
separator.setPadding(5, 0, 5, 0);
mTrack.addView(separator, mInsertPos);
Log.i("mInsertPos","mInsertPos 1 -->"+mInsertPos);
mInsertPos++;
}*/
Log.i("mInsertPos","mInsertPos 2 -->"+mInsertPos);
mTrack.addView(container, mInsertPos);
mInsertPos++;
mChildPos++;
Log.i("mChildPos","mChildPos 1 -->"+mChildPos);
Log.i("mInsertPos","mInsertPos 3 -->"+mInsertPos);
}
/**
* Show quickaction popup. Popup is automatically positioned, on top or bottom of anchor view.
*
*/
public void show (View anchor) {
preShow();
int xPos, yPos, arrowPos;
mDidAction = false;
int[] location = new int[2];
anchor.getLocationOnScreen(location);
Rect anchorRect = new Rect(location[0], location[1], location[0] + anchor.getWidth(), location[1]
+ anchor.getHeight());
//mRootView.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
mRootView.measure(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
int rootHeight = mRootView.getMeasuredHeight();
if (rootWidth == 0) {
rootWidth = mRootView.getMeasuredWidth();
}
int screenWidth = mWindowManager.getDefaultDisplay().getWidth();
int screenHeight = mWindowManager.getDefaultDisplay().getHeight();
//automatically get X coord of popup (top left)
if ((anchorRect.left + rootWidth) > screenWidth) {
xPos = anchorRect.left - (rootWidth-anchor.getWidth());
xPos = (xPos < 0) ? 0 : xPos;
arrowPos = anchorRect.centerX()-xPos;
} else {
if (anchor.getWidth() > rootWidth) {
xPos = anchorRect.centerX() - (rootWidth/2);
} else {
xPos = anchorRect.left;
}
arrowPos = anchorRect.centerX()-xPos;
}
int dyTop = anchorRect.top;
int dyBottom = screenHeight - anchorRect.bottom;
boolean onTop = (dyTop > dyBottom) ? true : false;
if (onTop) {
if (rootHeight > dyTop) {
yPos = 15;
LayoutParams l = mScroller.getLayoutParams();
l.height = dyTop - anchor.getHeight();
} else {
yPos = anchorRect.top - rootHeight;
}
} else {
yPos = anchorRect.bottom;
if (rootHeight > dyBottom) {
LayoutParams l = mScroller.getLayoutParams();
l.height = dyBottom;
}
}
showArrow(((onTop) ? R.id.arrow_down : R.id.arrow_up), arrowPos);
setAnimationStyle(screenWidth, anchorRect.centerX(), onTop);
mWindow.showAtLocation(anchor, Gravity.NO_GRAVITY, xPos, yPos);
}
/**
* Set animation style
*
* @param screenWidth screen width
* @param requestedX distance from left edge
* @param onTop flag to indicate where the popup should be displayed. Set TRUE if displayed on top of anchor view
* and vice versa
*/
private void setAnimationStyle(int screenWidth, int requestedX, boolean onTop) {
int arrowPos = requestedX - mArrowUp.getMeasuredWidth()/2;
switch (mAnimStyle) {
case ANIM_GROW_FROM_LEFT:
mWindow.setAnimationStyle((onTop) ? R.style.Animations_PopUpMenu_Left : R.style.Animations_PopDownMenu_Left);
break;
case ANIM_GROW_FROM_RIGHT:
mWindow.setAnimationStyle((onTop) ? R.style.Animations_PopUpMenu_Right : R.style.Animations_PopDownMenu_Right);
break;
case ANIM_GROW_FROM_CENTER:
mWindow.setAnimationStyle((onTop) ? R.style.Animations_PopUpMenu_Center : R.style.Animations_PopDownMenu_Center);
break;
case ANIM_REFLECT:
mWindow.setAnimationStyle((onTop) ? R.style.Animations_PopUpMenu_Reflect : R.style.Animations_PopDownMenu_Reflect);
break;
case ANIM_AUTO:
if (arrowPos <= screenWidth/4) {
mWindow.setAnimationStyle((onTop) ? R.style.Animations_PopUpMenu_Left : R.style.Animations_PopDownMenu_Left);
} else if (arrowPos > screenWidth/4 && arrowPos < 3 * (screenWidth/4)) {
mWindow.setAnimationStyle((onTop) ? R.style.Animations_PopUpMenu_Center : R.style.Animations_PopDownMenu_Center);
} else {
mWindow.setAnimationStyle((onTop) ? R.style.Animations_PopUpMenu_Right : R.style.Animations_PopDownMenu_Right);
}
break;
}
}
/**
* Show arrow
*
* @param whichArrow arrow type resource id
* @param requestedX distance from left screen
*/
private void showArrow(int whichArrow, int requestedX) {
final View showArrow = (whichArrow == R.id.arrow_up) ? mArrowUp : mArrowDown;
final View hideArrow = (whichArrow == R.id.arrow_up) ? mArrowDown : mArrowUp;
final int arrowWidth = mArrowUp.getMeasuredWidth();
showArrow.setVisibility(View.VISIBLE);
ViewGroup.MarginLayoutParams param = (ViewGroup.MarginLayoutParams)showArrow.getLayoutParams();
param.leftMargin = requestedX - arrowWidth / 2;
hideArrow.setVisibility(View.INVISIBLE);
}
/**
* Set listener for window dismissed. This listener will only be fired if the quicakction dialog is dismissed
* by clicking outside the dialog or clicking on sticky item.
*/
public void setOnDismissListener(QuickAction.OnDismissListener listener) {
setOnDismissListener(this);
mDismissListener = listener;
}
@Override
public void onDismiss() {
if (!mDidAction && mDismissListener != null) {
mDismissListener.onDismiss();
}
}
/**
* Listener for item click
*
*/
public interface OnActionItemClickListener {
public abstract void onItemClick(QuickAction source, int pos, int actionId);
}
/**
* Listener for window dismiss
*
*/
public interface OnDismissListener {
public abstract void onDismiss();
}
}
ExampleActivity.java
public class ExampleActivity extends Activity {
//action id
private static final int ID_UP = 1;
private static final int ID_DOWN = 1;
private static final int ID_SEARCH = 3;
private static final int ID_INFO = 4;
private static final int ID_ERASE = 5;
private static final int ID_OK = 6;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ActionItem nextItem = new ActionItem(ID_DOWN, "By MRN");
ActionItem prevItem = new ActionItem(ID_UP, "BY DATE");
ActionItem searchItem = new ActionItem(2, "BY NAME");
ActionItem infoItem = new ActionItem(2, "BY lOCATION");
ActionItem okItem = new ActionItem(3, "OK");
//use setSticky(true) to disable QuickAction dialog being dismissed after an item is clicked
prevItem.setSticky(true);
nextItem.setSticky(true);
searchItem.setSticky(true);
infoItem.setSticky(true);
//create QuickAction. Use QuickAction.VERTICAL or QuickAction.HORIZONTAL param to define layout
//orientation
final QuickAction quickAction = new QuickAction(this, QuickAction.VERTICAL);
//add action items into QuickAction
quickAction.addActionItem(nextItem);
System.out.println("nextItem");
quickAction.addActionItem(prevItem);
System.out.println("prevItem");
quickAction.addActionItem(searchItem);
System.out.println("searchItem");
quickAction.addActionItem(infoItem);
System.out.println("infoItem");
quickAction.addActionItem(okItem);
System.out.println("okItem");
//Set listener for action item clicked
quickAction.setOnActionItemClickListener(new QuickAction.OnActionItemClickListener() {
@Override
public void onItemClick(QuickAction source, int pos, int actionId) {
ActionItem actionItem = quickAction.getActionItem(pos);
//here we can filter which action item was clicked with pos or actionId parameter
/*if (actionId == ID_SEARCH) {
Toast.makeText(getApplicationContext(), "Let's do some search action", Toast.LENGTH_SHORT).show();
} else if (actionId == ID_INFO) {
Toast.makeText(getApplicationContext(), "I have no info this time", Toast.LENGTH_SHORT).show();
} else {*/
Toast.makeText(getApplicationContext(), actionItem.getTitle() + " selected", Toast.LENGTH_SHORT).show();
//}
}
});
//set listnener for on dismiss event, this listener will be called only if QuickAction dialog was dismissed
//by clicking the area outside the dialog.
quickAction.setOnDismissListener(new QuickAction.OnDismissListener() {
@Override
public void onDismiss() {
Toast.makeText(getApplicationContext(), "Dismissed", Toast.LENGTH_SHORT).show();
}
});
//show on btn1
Button btn1 = (Button) this.findViewById(R.id.btn1);
btn1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
quickAction.show(v);
}
});
Button btn2 = (Button) this.findViewById(R.id.btn2);
btn2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
quickAction.show(v);
}
});
/*Button btn3 = (Button) this.findViewById(R.id.btn3);
btn3.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
quickAction.show(v);
quickAction.setAnimStyle(QuickAction.ANIM_REFLECT);
}
});*/
}
}
解决方案
Quick Action Dialog Sample is given on the site:
Quick Action Dialog Sample