9

設計要件は、リストビューがあり、リストビューの項目にボタンがあり、ボタンを押して、ポップアップウィンドウをボタンの下ではなく常に上に表示することです。

Android では、「showAsDropDown」を使用します。これは、ボタン (ビューまたはアンカー) の下部にあるポップアップ ウィンドウの既定の表示です。ただし、下部が表示されない場合、ポップアップウィンドウはボタン (ビューまたはアンカー) の上に表示されます。

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

そこで、この点を踏まえて、「setSelectionFromTop」でボタンの項目を移動させるには、判定がボタンの下に表示されるほど効果がないようにしましょう。</p>

Android 4.0.3 では、アイテムが移動し、ポップアップ ウィンドウに新しい位置と上記が表示されますが、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 に答える