summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Adam Powell <adamp@google.com> 2011-01-19 17:58:04 -0800
committer Adam Powell <adamp@google.com> 2011-01-19 21:09:43 -0800
commit5f83a6017bacb513610df83a36b1f55953e65ad4 (patch)
tree4ac548197c8d95afb076dc2bfdefc6870e4a651d
parented58d8ed8a50cbd8c5e01c4e51bcbbe4341d1dfd (diff)
Better fix for bug 3112733
Make sure PopupWindows set to clip to the screen and that are anchored to another view do not clip off the top of the screen. Change-Id: I6ef9d61982dfda18a4ee7c69128932f5e08aa884
-rw-r--r--core/java/android/widget/PopupWindow.java10
-rw-r--r--core/java/android/widget/Spinner.java36
2 files changed, 9 insertions, 37 deletions
diff --git a/core/java/android/widget/PopupWindow.java b/core/java/android/widget/PopupWindow.java
index 79d6a81d2461..439e0cabe19f 100644
--- a/core/java/android/widget/PopupWindow.java
+++ b/core/java/android/widget/PopupWindow.java
@@ -28,7 +28,6 @@ import android.graphics.drawable.StateListDrawable;
import android.os.Build;
import android.os.IBinder;
import android.util.AttributeSet;
-import android.util.DisplayMetrics;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.MotionEvent;
@@ -1087,7 +1086,14 @@ public class PopupWindow {
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;
diff --git a/core/java/android/widget/Spinner.java b/core/java/android/widget/Spinner.java
index e38a69fde005..0baddcb97501 100644
--- a/core/java/android/widget/Spinner.java
+++ b/core/java/android/widget/Spinner.java
@@ -23,14 +23,13 @@ import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.res.TypedArray;
import android.database.DataSetObserver;
-import android.graphics.Rect;
import android.graphics.drawable.Drawable;
+import android.graphics.Rect;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
-import android.view.ViewTreeObserver;
/**
@@ -70,8 +69,6 @@ public class Spinner extends AbsSpinner implements OnClickListener {
private int mGravity;
- private LayoutObserver mLayoutObserver;
-
/**
* 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));
mPopup = popup;
- mLayoutObserver = new LayoutObserver();
break;
}
}
@@ -425,11 +421,6 @@ public class Spinner extends AbsSpinner implements OnClickListener {
handled = true;
if (!mPopup.isShowing()) {
- if (mLayoutObserver != null) {
- final ViewTreeObserver vto = getViewTreeObserver();
- vto.addOnGlobalLayoutListener(mLayoutObserver);
- vto.addOnScrollChangedListener(mLayoutObserver);
- }
mPopup.show();
}
}
@@ -677,7 +668,6 @@ public class Spinner extends AbsSpinner implements OnClickListener {
super.show();
getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
setSelection(Spinner.this.getSelectedItemPosition());
- setOnDismissListener(mLayoutObserver);
}
@Override
@@ -728,28 +718,4 @@ public class Spinner extends AbsSpinner implements OnClickListener {
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);
- }
- }
}