Cuadro de diálogo rápido utilizando la vista de búsqueda onclick en Android

Estoy buscando un diálogo de Acción Rápida usando la vista de búsqueda en un clic. Aquí está la imagen que muestra lo que estoy buscando:

http://www.freeimagehosting.net/newuploads/frclk.png

¿Alguien tiene una muestra o enlace que muestre cómo lograr esto?

Además, ¿cómo puedo romper el diálogo de acción rápida en dos partes? Actualmente se muestra así:

http://www.freeimagehosting.net/newuploads/3vr1p.png

Me gusta:

| check  check  check  check |

Quiero de esta manera:

  | check     check  |
  | check     check  |
  |       Ok         |

Aquí está mi código:

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);
        }
    });*/
}
}

Respuestas a la pregunta(1)

Su respuesta a la pregunta