如何在按钮(视图)上方显示弹出窗口?

时间:2012-04-08 09:20:40

标签: android popupwindow

设计要求是,有一个列表视图,在列表视图的项目中,有一个按钮,按下按钮,然后,在按钮上方显示一个弹出窗口,而不是底部。

在Android中,使用“showAsDropDown”,Popupwindow默认显示在按钮底部(视图或锚点)。 但如果底部没有显示,Popupwindow将显示在按钮的顶部(视图或锚点)。

onTop = (displayFrame.bottom - mScreenLocation[1] - anchor.getHeight() - yoff) <(mScreenLocation[1] - yoff - displayFrame.top);

所以,我根据这一点,通过“setSelectionFromTop”移动按钮的项目,让判断没有显示在按钮底部以实现有效性。

在android 4.0.3中,没关系,项目移动,弹出窗口显示新位置和高于, 但, 在android 2.2中,弹出窗口仍显示按下Where,而不是移动后的位置。

boolean onTop = (displayFrame.bottom - mScreenLocation[1] - v.getHeight() - 0) < (mScreenLocation[1] - 0 - displayFrame.top);
if(!onTop){
mListMain.setSelectionFromTop(mListMain.getPositionForView(v),(displayFrame.bottom - v.getHeight() + displayFrame.top) / 2 );
}

可以帮助我,如何解决?!.. T_T

1 个答案:

答案 0 :(得分:5)

可能情况不一样,但我的解决方案是:

public class BaloonView extends PopupWindow {   
    public BaloonView(Context context, View content) {
        super(context);
        setWidth(WindowManager.LayoutParams.WRAP_CONTENT);
        setHeight(WindowManager.LayoutParams.WRAP_CONTENT);
        setTouchable(true);
        setFocusable(true);
        setOutsideTouchable(true);  
        setTouchInterceptor(new View.OnTouchListener() {
              @Override
              public boolean onTouch(View v, MotionEvent event) {
                if (event.getAction() == MotionEvent.ACTION_OUTSIDE) {
                    BaloonView.this.dismiss();                
                  return true;
                }               
                return false;
              }
            });
    }

    public void showUnderView(View view, View content) {
        setBackgroundDrawable(view.getContext().getResources().getDrawable(R.drawable.popup_inline_error_holo_dark));
        FrameLayout container = new FrameLayout(view.getContext());
        container.addView(content);
        setContentView(container);
        int[] location = new int[2];
        view.getLocationOnScreen(location);
        container.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
        int xoffset = view.getWidth() / 2 - container.getMeasuredWidth() / 2;
        showAsDropDown(view, xoffset, 0);
    }
}