设计要求是,有一个列表视图,在列表视图的项目中,有一个按钮,按下按钮,然后,在按钮上方显示一个弹出窗口,而不是底部。
在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
答案 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);
}
}