Merge change 5188 into donut

* changes:
  Fixes #1905761. Updates the height of ACTV's drop down whenever the IME changes.
This commit is contained in:
Android (Google) Code Review
2009-06-23 22:46:29 -07:00
6 changed files with 133 additions and 30 deletions

View File

@@ -3485,17 +3485,6 @@
visibility="public"
>
</field>
<field name="donut_resource_pad29"
type="int"
transient="false"
volatile="false"
value="16843395"
static="true"
final="true"
deprecated="not deprecated"
visibility="public"
>
</field>
<field name="donut_resource_pad3"
type="int"
transient="false"
@@ -3672,6 +3661,17 @@
visibility="public"
>
</field>
<field name="dropDownHeight"
type="int"
transient="false"
volatile="false"
value="16843395"
static="true"
final="true"
deprecated="not deprecated"
visibility="public"
>
</field>
<field name="dropDownHintAppearance"
type="int"
transient="false"
@@ -162150,6 +162150,17 @@
visibility="public"
>
</method>
<method name="getDropDownHeight"
return="int"
abstract="false"
native="false"
synchronized="false"
static="false"
final="false"
deprecated="not deprecated"
visibility="public"
>
</method>
<method name="getDropDownWidth"
return="int"
abstract="false"
@@ -162373,6 +162384,19 @@
<parameter name="id" type="int">
</parameter>
</method>
<method name="setDropDownHeight"
return="void"
abstract="false"
native="false"
synchronized="false"
static="false"
final="false"
deprecated="not deprecated"
visibility="public"
>
<parameter name="height" type="int">
</parameter>
</method>
<method name="setDropDownWidth"
return="void"
abstract="false"

View File

@@ -80,6 +80,7 @@ import com.android.internal.R;
* @attr ref android.R.styleable#AutoCompleteTextView_dropDownSelector
* @attr ref android.R.styleable#AutoCompleteTextView_dropDownAnchor
* @attr ref android.R.styleable#AutoCompleteTextView_dropDownWidth
* @attr ref android.R.styleable#AutoCompleteTextView_dropDownHeight
*/
public class AutoCompleteTextView extends EditText implements Filter.FilterListener {
static final boolean DEBUG = false;
@@ -101,6 +102,7 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe
private int mDropDownAnchorId;
private View mDropDownAnchorView; // view is retrieved lazily from id once needed
private int mDropDownWidth;
private int mDropDownHeight;
private Drawable mDropDownListHighlight;
@@ -166,6 +168,8 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe
// (for full screen width) or WRAP_CONTENT (to match the width of the anchored view).
mDropDownWidth = a.getLayoutDimension(R.styleable.AutoCompleteTextView_dropDownWidth,
ViewGroup.LayoutParams.WRAP_CONTENT);
mDropDownHeight = a.getLayoutDimension(R.styleable.AutoCompleteTextView_dropDownHeight,
ViewGroup.LayoutParams.WRAP_CONTENT);
mHintResource = a.getResourceId(R.styleable.AutoCompleteTextView_completionHintView,
R.layout.simple_dropdown_hint);
@@ -254,6 +258,34 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe
public void setDropDownWidth(int width) {
mDropDownWidth = width;
}
/**
* <p>Returns the current height for the auto-complete drop down list. This can
* be a fixed height, or {@link ViewGroup.LayoutParams#FILL_PARENT} to fill
* the screen, or {@link ViewGroup.LayoutParams#WRAP_CONTENT} to fit the height
* of the drop down's content.</p>
*
* @return the height for the drop down list
*
* @attr ref android.R.styleable#AutoCompleteTextView_dropDownHeight
*/
public int getDropDownHeight() {
return mDropDownHeight;
}
/**
* <p>Sets the current height for the auto-complete drop down list. This can
* be a fixed height, or {@link ViewGroup.LayoutParams#FILL_PARENT} to fill
* the screen, or {@link ViewGroup.LayoutParams#WRAP_CONTENT} to fit the height
* of the drop down's content.</p>
*
* @param height the height to use
*
* @attr ref android.R.styleable#AutoCompleteTextView_dropDownHeight
*/
public void setDropDownHeight(int height) {
mDropDownHeight = height;
}
/**
* <p>Returns the id for the view that the auto-complete drop down list is anchored to.</p>
@@ -635,7 +667,7 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe
// event to prevent focus from moving.
clearListSelection();
mPopup.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED);
mPopup.update();
showDropDown();
return true;
} else {
// WARNING: Please read the comment where mListSelectionHidden
@@ -655,7 +687,7 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe
// by ensuring it has focus and getting its window out
// of touch mode.
mDropDownList.requestFocusFromTouch();
mPopup.update();
showDropDown();
switch (keyCode) {
// avoid passing the focus from the text view to the
@@ -1052,8 +1084,13 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe
*/
public void showDropDown() {
int height = buildDropDown();
int widthSpec = 0;
int heightSpec = 0;
boolean noInputMethod = mPopup.getInputMethodMode() == PopupWindow.INPUT_METHOD_NOT_NEEDED;
if (mPopup.isShowing()) {
int widthSpec;
if (mDropDownWidth == ViewGroup.LayoutParams.FILL_PARENT) {
// The call to PopupWindow's update method below can accept -1 for any
// value you do not want to update.
@@ -1063,20 +1100,51 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe
} else {
widthSpec = mDropDownWidth;
}
if (mDropDownHeight == ViewGroup.LayoutParams.FILL_PARENT) {
// The call to PopupWindow's update method below can accept -1 for any
// value you do not want to update.
heightSpec = noInputMethod ? height : ViewGroup.LayoutParams.FILL_PARENT;
if (noInputMethod) {
mPopup.setWindowLayoutMode(
mDropDownWidth == ViewGroup.LayoutParams.FILL_PARENT ?
ViewGroup.LayoutParams.FILL_PARENT : 0, 0);
} else {
mPopup.setWindowLayoutMode(
mDropDownWidth == ViewGroup.LayoutParams.FILL_PARENT ?
ViewGroup.LayoutParams.FILL_PARENT : 0,
ViewGroup.LayoutParams.FILL_PARENT);
}
} else if (mDropDownHeight == ViewGroup.LayoutParams.WRAP_CONTENT) {
heightSpec = height;
} else {
heightSpec = mDropDownHeight;
}
mPopup.update(getDropDownAnchorView(), mDropDownHorizontalOffset,
mDropDownVerticalOffset, widthSpec, height);
mDropDownVerticalOffset, widthSpec, heightSpec);
} else {
if (mDropDownWidth == ViewGroup.LayoutParams.FILL_PARENT) {
mPopup.setWindowLayoutMode(ViewGroup.LayoutParams.FILL_PARENT, 0);
widthSpec = ViewGroup.LayoutParams.FILL_PARENT;
} else {
mPopup.setWindowLayoutMode(0, 0);
if (mDropDownWidth == ViewGroup.LayoutParams.WRAP_CONTENT) {
mPopup.setWidth(getDropDownAnchorView().getWidth());
} else {
mPopup.setWidth(mDropDownWidth);
}
}
mPopup.setHeight(height);
if (mDropDownHeight == ViewGroup.LayoutParams.FILL_PARENT) {
heightSpec = ViewGroup.LayoutParams.FILL_PARENT;
} else {
if (mDropDownHeight == ViewGroup.LayoutParams.WRAP_CONTENT) {
mPopup.setHeight(height);
} else {
mPopup.setHeight(mDropDownHeight);
}
}
mPopup.setWindowLayoutMode(widthSpec, heightSpec);
mPopup.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED);
// use outside touchable to dismiss drop down when touching outside of it, so
@@ -1195,10 +1263,12 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe
final int maxHeight = mPopup.getMaxAvailableHeight(
getDropDownAnchorView(), mDropDownVerticalOffset, ignoreBottomDecorations);
final int measuredHeight = mDropDownList.measureHeightOfChildren(MeasureSpec.UNSPECIFIED,
0, ListView.NO_POSITION, maxHeight - otherHeights, 2) + otherHeights;
if (mDropDownAlwaysVisible) {
return maxHeight;
}
return mDropDownAlwaysVisible ? maxHeight : measuredHeight;
return mDropDownList.measureHeightOfChildren(MeasureSpec.UNSPECIFIED,
0, ListView.NO_POSITION, maxHeight - otherHeights, 2) + otherHeights;
}
private View getHintView(Context context) {

View File

@@ -49,7 +49,7 @@ import java.lang.ref.WeakReference;
*/
public class PopupWindow {
/**
* Mode for {@link #setInputMethodMode(int): the requirements for the
* Mode for {@link #setInputMethodMode(int)}: the requirements for the
* input method should be based on the focusability of the popup. That is
* if it is focusable than it needs to work with the input method, else
* it doesn't.
@@ -57,16 +57,15 @@ public class PopupWindow {
public static final int INPUT_METHOD_FROM_FOCUSABLE = 0;
/**
* Mode for {@link #setInputMethodMode(int): this popup always needs to
* Mode for {@link #setInputMethodMode(int)}: this popup always needs to
* work with an input method, regardless of whether it is focusable. This
* means that it will always be displayed so that the user can also operate
* the input method while it is shown.
*/
public static final int INPUT_METHOD_NEEDED = 1;
/**
* Mode for {@link #setInputMethodMode(int): this popup never needs to
* Mode for {@link #setInputMethodMode(int)}: this popup never needs to
* work with an input method, regardless of whether it is focusable. This
* means that it will always be displayed to use as much space on the
* screen as needed, regardless of whether this covers the input method.
@@ -1131,8 +1130,7 @@ public class PopupWindow {
return;
}
WindowManager.LayoutParams p = (WindowManager.LayoutParams)
mPopupView.getLayoutParams();
WindowManager.LayoutParams p = (WindowManager.LayoutParams) mPopupView.getLayoutParams();
boolean update = force;
@@ -1219,8 +1217,7 @@ public class PopupWindow {
registerForScrollChanged(anchor, xoff, yoff);
}
WindowManager.LayoutParams p = (WindowManager.LayoutParams)
mPopupView.getLayoutParams();
WindowManager.LayoutParams p = (WindowManager.LayoutParams) mPopupView.getLayoutParams();
if (updateDimension) {
if (width == -1) {

View File

@@ -76,6 +76,7 @@
android:ellipsize="end"
android:inputType="text|textAutoComplete"
android:dropDownWidth="fill_parent"
android:dropDownHeight="fill_parent"
android:dropDownAnchor="@id/search_plate"
android:dropDownVerticalOffset="-9dip"
android:popupBackground="@android:drawable/search_dropdown_background"

View File

@@ -1998,6 +1998,16 @@
<!-- The dropdown should fit the width of its anchor. -->
<enum name="wrap_content" value="-2" />
</attr>
<!-- Specifies the basic width of the dropdown. Its value may
be a dimension (such as "12dip") for a constant width, fill_parent
to fill the width of the screen, or wrap_content to match the height of
the content of the drop down. -->
<attr name="dropDownHeight" format="dimension">
<!-- The dropdown should fill the width of the screen. -->
<enum name="fill_parent" value="-1" />
<!-- The dropdown should fit the width of its anchor. -->
<enum name="wrap_content" value="-2" />
</attr>
<attr name="inputType" />
</declare-styleable>
<declare-styleable name="PopupWindow">

View File

@@ -1116,7 +1116,8 @@
<public type="attr" name="allowBackup" />
<public type="attr" name="glEsVersion" />
<public type="attr" name="queryAfterZeroResults" />
<public type="attr" name="dropDownHeight" />
<public-padding type="attr" name="donut_resource_pad" end="0x0101029f" />
<public-padding type="id" name="donut_resource_pad" end="0x01020040" />