Merge "Better fix for bug 3112733" into honeycomb

This commit is contained in:
Adam Powell
2011-01-19 21:52:33 -08:00
committed by Android (Google) Code Review
2 changed files with 9 additions and 37 deletions

View File

@@ -28,7 +28,6 @@ import android.graphics.drawable.StateListDrawable;
import android.os.Build; import android.os.Build;
import android.os.IBinder; import android.os.IBinder;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.Gravity; import android.view.Gravity;
import android.view.KeyEvent; import android.view.KeyEvent;
import android.view.MotionEvent; import android.view.MotionEvent;
@@ -1087,7 +1086,14 @@ public class PopupWindow {
p.width = Math.min(p.width, displayFrameWidth); p.width = Math.min(p.width, displayFrameWidth);
} }
p.y = Math.max(p.y, displayFrame.top); if (onTop) {
int popupTop = mScreenLocation[1] + yoff - mPopupHeight;
if (popupTop < 0) {
p.y += popupTop;
}
} else {
p.y = Math.max(p.y, displayFrame.top);
}
} }
p.gravity |= Gravity.DISPLAY_CLIP_VERTICAL; p.gravity |= Gravity.DISPLAY_CLIP_VERTICAL;

View File

@@ -23,14 +23,13 @@ import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener; import android.content.DialogInterface.OnClickListener;
import android.content.res.TypedArray; import android.content.res.TypedArray;
import android.database.DataSetObserver; import android.database.DataSetObserver;
import android.graphics.Rect;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.graphics.Rect;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.util.DisplayMetrics; import android.util.DisplayMetrics;
import android.view.Gravity; import android.view.Gravity;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.ViewTreeObserver;
/** /**
@@ -70,8 +69,6 @@ public class Spinner extends AbsSpinner implements OnClickListener {
private int mGravity; private int mGravity;
private LayoutObserver mLayoutObserver;
/** /**
* Construct a new spinner with the given context's theme. * Construct a new spinner with the given context's theme.
* *
@@ -172,7 +169,6 @@ public class Spinner extends AbsSpinner implements OnClickListener {
com.android.internal.R.styleable.Spinner_dropDownHorizontalOffset, 0)); com.android.internal.R.styleable.Spinner_dropDownHorizontalOffset, 0));
mPopup = popup; mPopup = popup;
mLayoutObserver = new LayoutObserver();
break; break;
} }
} }
@@ -425,11 +421,6 @@ public class Spinner extends AbsSpinner implements OnClickListener {
handled = true; handled = true;
if (!mPopup.isShowing()) { if (!mPopup.isShowing()) {
if (mLayoutObserver != null) {
final ViewTreeObserver vto = getViewTreeObserver();
vto.addOnGlobalLayoutListener(mLayoutObserver);
vto.addOnScrollChangedListener(mLayoutObserver);
}
mPopup.show(); mPopup.show();
} }
} }
@@ -677,7 +668,6 @@ public class Spinner extends AbsSpinner implements OnClickListener {
super.show(); super.show();
getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
setSelection(Spinner.this.getSelectedItemPosition()); setSelection(Spinner.this.getSelectedItemPosition());
setOnDismissListener(mLayoutObserver);
} }
@Override @Override
@@ -728,28 +718,4 @@ public class Spinner extends AbsSpinner implements OnClickListener {
ViewGroup.LayoutParams.WRAP_CONTENT); ViewGroup.LayoutParams.WRAP_CONTENT);
} }
} }
private class LayoutObserver implements ViewTreeObserver.OnGlobalLayoutListener,
ViewTreeObserver.OnScrollChangedListener, PopupWindow.OnDismissListener {
@Override
public void onScrollChanged() {
if (mPopup != null && mPopup.isShowing()) {
mPopup.show();
}
}
@Override
public void onGlobalLayout() {
if (mPopup != null && mPopup.isShowing()) {
mPopup.show();
}
}
@Override
public void onDismiss() {
ViewTreeObserver vto = getViewTreeObserver();
vto.removeGlobalOnLayoutListener(mLayoutObserver);
vto.removeOnScrollChangedListener(mLayoutObserver);
}
}
} }