Quick dialog using onclick search view in android

2020-02-06 17:51发布

问题:

I am looking for a QuickAction dialog using onclick search view. Here is image showing what I am looking for:

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

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:

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

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

回答1:

Quick Action Dialog Sample is given on the site:

Quick Action Dialog Sample