使用android系统中点击搜索视图快速对话框视图、对话框、快速、系统

2023-09-12 10:28:51 作者:长不大的小祸害

我要寻找使用点击搜索视图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>();

私人布尔mD​​idAction;

私人诠释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_horizo​​ntal);
    } 其他 {
        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_horizo​​ntal,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();
}
  }
 
FonePaw for Android破解版下载 FonePaw for Android v3.3.0 绿色中文版下载 9553下载

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(真正的);
    sea​​rchItem.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