9

设计要求是,有一个listview,在listview的items中,有一个按钮,按下按钮,然后,总是在按钮上方显示一个弹出窗口,而不是底部。

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

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

所以,我根据这一点,通过“setSelectionFromTop”来移动按钮的item,让判断没有足够的显示在按钮的底部来达到效果。</p>

在android 4.0.3中,是ok的,item移动了,弹窗显示新的位置和上面,但是,在android 2.2中,弹窗仍然显示按下的位置,而不是移动后的位置。</p>

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

4

1 回答 1

6

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

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);
    }
}
于 2012-10-10T15:25:42.783 回答