全屏 AlertDialog 在显示键盘时有 janky 动画
Full-screen AlertDialog has janky animation when keyboard is shown
在此处观看视频以查看问题:https://streamable.com/s0yhrm
或在更快的设备上查看:https://streamable.com/4sshdn
我有一个 AlertDialog,我已将其设置为获取所有垂直 space。问题是当键盘出现时,当 AlertDialog 调整大小以适应键盘上方时,我得到一个讨厌的动画。有什么办法可以防止这种情况发生吗?理想情况下,它应该在 AlertDialog 显示之前测量键盘上方的可用 space。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/enter_address_alert_dialog_root_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="4dp">
<TextView
android:id="@+id/title_textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_marginLeft="10dp"
android:layout_marginTop="6dp"
android:paddingLeft="12dp"
android:paddingTop="6dp"
android:paddingBottom="4dp"
android:text="Delivery address"
android:textSize="14dp"
android:textStyle="bold" />
<ImageView
android:id="@+id/network_error_imageView"
android:layout_alignParentRight="true"
android:src="@drawable/cloud_off_36dp"
app:tint="@color/colorError"
android:visibility="gone"
tools:visibility="visible"
android:layout_alignTop="@id/title_textView"
android:layout_alignBottom="@id/title_textView"
android:layout_marginRight="12dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<LinearLayout
android:id="@+id/top_LinearLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:layout_below="@id/title_textView"
android:background="@drawable/autocomplete_list_item_background"
android:elevation="2dp"
android:paddingLeft="8dp"
android:paddingTop="2dp"
android:paddingRight="8dp"
android:paddingBottom="12dp">
<RelativeLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="3"
android:gravity="bottom">
<EditText
android:id="@+id/address_editText"
style="@style/MyEditTextStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Street address"
android:imeOptions="actionNext"
android:maxLength="100"
android:maxLines="4"
android:importantForAutofill="no"
android:paddingLeft="4dp"
android:paddingTop="8dp"
android:paddingRight="32dp"
android:selectAllOnFocus="true"
android:textSize="@dimen/address_alert_dialog_text_size" />
<ImageButton
android:id="@+id/clear_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:paddingTop="4dp"
android:paddingLeft="4dp"
android:paddingRight="4dp"
android:paddingBottom="0dp"
android:background="?selectableItemBackgroundBorderless"
android:src="@drawable/ic_close_24dp" />
</RelativeLayout>
<EditText
android:id="@+id/enter_address_unit_number_alert_dialog_edit_text"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:layout_marginLeft="16dp"
android:layout_weight="0.8"
android:gravity="center"
android:imeOptions="actionDone"
android:hint="Unit #"
android:importantForAutofill="no"
android:inputType="textPostalAddress|textCapWords|text"
android:maxLength="30"
android:paddingTop="6dp"
android:selectAllOnFocus="true"
android:textSize="@dimen/address_alert_dialog_text_size" />
</LinearLayout>
<ScrollView
android:id="@+id/scrollView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_above="@id/map_button"
android:layout_below="@id/top_LinearLayout">
<!--Single parent to ScrollView-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/no_store_address_enter_address_alert_dialog_text_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="18dp"
android:layout_marginTop="@dimen/address_autocomplete_margin_above_empty_view"
android:layout_marginRight="18dp"
android:textSize="@dimen/address_alert_dialog_no_store_address_text_size"
android:text="You haven't entered a store address. Without this, the app can't locate delivery addresses or calculate driving distances. To fix this, go to Settings and use the 'Store addresses' option."
android:textColor="#F00"
android:visibility="gone" />
<TextView
android:id="@+id/enter_address_alert_dialog_empty_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="18dp"
android:layout_marginTop="@dimen/address_autocomplete_margin_above_empty_view"
android:layout_marginRight="18dp"
android:drawablePadding="6dp"
android:gravity="center_horizontal"
android:padding="12dp"
android:text="Start typing an address above and matching results will show up here"
android:textSize="@dimen/address_alert_dialog_text_size"
app:drawableTint="@color/colorAutocompleteEmptyViewIcon"
app:drawableTopCompat="@drawable/ic_search_white_28dp" />
</LinearLayout>
</ScrollView>
<ListView
android:id="@+id/enter_address_alert_dialog_list_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@id/map_button"
android:layout_below="@id/scrollView"
android:layout_marginLeft="8dp"
android:layout_marginTop="4dp"
android:layout_marginRight="8dp"
android:layout_marginBottom="4dp"
android:divider="@android:color/transparent"
android:dividerHeight="-3dp" />
<TextView
android:id="@+id/map_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentBottom="true"
android:layout_marginLeft="16dp"
android:background="@drawable/toolbar_image_button_ripple"
android:fontFamily="sans-serif-medium"
android:padding="8dp"
android:text="MAP"
android:textColor="@color/colorAlertDialogButton"
android:textSize="@dimen/alert_dialog_button_text_size" />
<TextView
android:id="@+id/cancel_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginRight="15dp"
android:layout_toLeftOf="@id/submit_button"
android:background="@drawable/toolbar_image_button_ripple"
android:fontFamily="sans-serif-medium"
android:padding="8dp"
android:text="CANCEL"
android:textColor="@color/colorAlertDialogButton"
android:textSize="@dimen/alert_dialog_button_text_size" />
<TextView
android:id="@+id/submit_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
android:layout_marginRight="20dp"
android:background="@drawable/toolbar_image_button_ripple"
android:fontFamily="sans-serif-medium"
android:padding="8dp"
android:text="SUBMIT"
android:textColor="@color/colorAlertDialogButton"
android:textSize="@dimen/alert_dialog_button_text_size" />
</RelativeLayout>
没有针对您的问题的“默认”解决方法。你的 Dialog
首先出现,然后 EditText
被绘制,它请求焦点然后键盘显示 - Dialog
已经被绘制(全屏),所以它缩小
也许你可以尝试在 Dialog
出现之前强制显示键盘
((InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE)).
toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);
然后显示您的 Dialog
(可能会有几毫秒的延迟?)并调用 editText.requestFocus()
将键盘“连接”到新显示的 EditText
(会有变化自动完成,因为 EditText
可能会在膨胀时请求焦点)
我能够通过仅在用户开始键入时扩展 AlertDialog 的高度来以令人满意的方式解决此问题。在此处观看视频:https://streamable.com/oj3fbv
addressEditText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
String inputText = s.toString().toLowerCase().trim();
if (inputText.length() > 0) {
if (inputText.length() == 1) {
autocompleteListView.setVisibility(View.VISIBLE);
RelativeLayout.LayoutParams listViewParams = new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.MATCH_PARENT,
RelativeLayout.LayoutParams.MATCH_PARENT);
listViewParams.addRule(RelativeLayout.BELOW, topLinearLayout.getId());
listViewParams.addRule(RelativeLayout.ABOVE, mapButton.getId());
listViewParams.leftMargin = dpToPx(8);
listViewParams.rightMargin = dpToPx(8);
listViewParams.topMargin = dpToPx(4);
listViewParams.bottomMargin = dpToPx(4);
autocompleteListView.setLayoutParams(listViewParams);
RelativeLayout.LayoutParams mapButtonParams = new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.MATCH_PARENT,
RelativeLayout.LayoutParams.WRAP_CONTENT);
mapButtonParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
mapButton.setLayoutParams(mapButtonParams);
}
clearButton.setVisibility(View.VISIBLE);
if (inputText.length() > 1 && storeAddressEntered) {
alertDialogEmptyView.setVisibility(View.GONE);
scrollView.setVisibility(View.GONE);
}
}
alertDialogAdapter.getFilter().filter(inputText);
}
});
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/enter_address_alert_dialog_root_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="4dp">
<TextView
android:id="@+id/title_textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_marginLeft="10dp"
android:layout_marginTop="6dp"
android:paddingLeft="12dp"
android:paddingTop="6dp"
android:paddingBottom="4dp"
android:text="Delivery address"
android:textSize="14dp"
android:textStyle="bold" />
<ImageView
android:id="@+id/network_error_imageView"
android:layout_alignParentRight="true"
android:src="@drawable/cloud_off_36dp"
app:tint="@color/colorError"
android:visibility="gone"
tools:visibility="visible"
android:layout_alignTop="@id/title_textView"
android:layout_alignBottom="@id/title_textView"
android:layout_marginRight="12dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<LinearLayout
android:id="@+id/top_LinearLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:layout_below="@id/title_textView"
android:background="@drawable/autocomplete_list_item_background"
android:elevation="2dp"
android:paddingLeft="8dp"
android:paddingTop="2dp"
android:paddingRight="8dp"
android:paddingBottom="12dp">
<RelativeLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="3"
android:gravity="bottom">
<EditText
android:id="@+id/address_editText"
style="@style/MyEditTextStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Street address"
android:imeOptions="actionNext"
android:maxLength="100"
android:maxLines="4"
android:importantForAutofill="no"
android:paddingLeft="4dp"
android:paddingTop="8dp"
android:paddingRight="32dp"
android:selectAllOnFocus="true"
android:textSize="@dimen/address_alert_dialog_text_size" />
<ImageButton
android:id="@+id/clear_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:paddingTop="4dp"
android:paddingLeft="4dp"
android:paddingRight="4dp"
android:paddingBottom="0dp"
android:background="?selectableItemBackgroundBorderless"
android:src="@drawable/ic_close_24dp" />
</RelativeLayout>
<EditText
android:id="@+id/enter_address_unit_number_alert_dialog_edit_text"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:layout_marginLeft="16dp"
android:layout_weight="0.8"
android:gravity="center"
android:imeOptions="actionDone"
android:hint="Unit #"
android:importantForAutofill="no"
android:inputType="textPostalAddress|textCapWords|text"
android:maxLength="30"
android:paddingTop="6dp"
android:selectAllOnFocus="true"
android:textSize="@dimen/address_alert_dialog_text_size" />
</LinearLayout>
<ScrollView
android:id="@+id/scrollView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/top_LinearLayout">
<!--Single parent to ScrollView-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/no_store_address_enter_address_alert_dialog_text_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="18dp"
android:layout_marginTop="@dimen/address_autocomplete_margin_above_empty_view"
android:layout_marginRight="18dp"
android:textSize="@dimen/address_alert_dialog_no_store_address_text_size"
android:text="You haven't entered a store address. Without this, the app can't locate delivery addresses or calculate driving distances. To fix this, go to Settings and use the 'Store addresses' option."
android:textColor="#F00"
android:visibility="gone" />
<TextView
android:id="@+id/enter_address_alert_dialog_empty_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="18dp"
android:layout_marginRight="18dp"
android:drawablePadding="6dp"
android:gravity="center_horizontal"
android:padding="12dp"
android:text="Start typing an address above and matching results will show up here"
android:textSize="@dimen/address_alert_dialog_text_size"
app:drawableTint="@color/colorAutocompleteEmptyViewIcon"
app:drawableTopCompat="@drawable/ic_search_white_28dp" />
</LinearLayout>
</ScrollView>
<ListView
android:id="@+id/enter_address_alert_dialog_list_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/scrollView"
android:visibility="gone"
android:layout_marginLeft="8dp"
android:layout_marginTop="4dp"
android:layout_marginRight="8dp"
android:layout_marginBottom="4dp"
android:divider="@android:color/transparent"
android:dividerHeight="-3dp" />
<TextView
android:id="@+id/map_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@id/scrollView"
android:layout_marginLeft="16dp"
android:background="@drawable/toolbar_image_button_ripple"
android:fontFamily="sans-serif-medium"
android:padding="8dp"
android:text="MAP"
android:textColor="@color/colorAlertDialogButton"
android:textSize="@dimen/alert_dialog_button_text_size" />
<TextView
android:id="@+id/cancel_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@id/map_button"
android:layout_marginRight="15dp"
android:layout_toLeftOf="@id/submit_button"
android:background="@drawable/toolbar_image_button_ripple"
android:fontFamily="sans-serif-medium"
android:padding="8dp"
android:text="CANCEL"
android:textColor="@color/colorAlertDialogButton"
android:textSize="@dimen/alert_dialog_button_text_size" />
<TextView
android:id="@+id/submit_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignBottom="@id/map_button"
android:layout_marginRight="20dp"
android:background="@drawable/toolbar_image_button_ripple"
android:fontFamily="sans-serif-medium"
android:padding="8dp"
android:text="SUBMIT"
android:textColor="@color/colorAlertDialogButton"
android:textSize="@dimen/alert_dialog_button_text_size" />
</RelativeLayout>
在此处观看视频以查看问题:https://streamable.com/s0yhrm
或在更快的设备上查看:https://streamable.com/4sshdn
我有一个 AlertDialog,我已将其设置为获取所有垂直 space。问题是当键盘出现时,当 AlertDialog 调整大小以适应键盘上方时,我得到一个讨厌的动画。有什么办法可以防止这种情况发生吗?理想情况下,它应该在 AlertDialog 显示之前测量键盘上方的可用 space。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/enter_address_alert_dialog_root_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="4dp">
<TextView
android:id="@+id/title_textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_marginLeft="10dp"
android:layout_marginTop="6dp"
android:paddingLeft="12dp"
android:paddingTop="6dp"
android:paddingBottom="4dp"
android:text="Delivery address"
android:textSize="14dp"
android:textStyle="bold" />
<ImageView
android:id="@+id/network_error_imageView"
android:layout_alignParentRight="true"
android:src="@drawable/cloud_off_36dp"
app:tint="@color/colorError"
android:visibility="gone"
tools:visibility="visible"
android:layout_alignTop="@id/title_textView"
android:layout_alignBottom="@id/title_textView"
android:layout_marginRight="12dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<LinearLayout
android:id="@+id/top_LinearLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:layout_below="@id/title_textView"
android:background="@drawable/autocomplete_list_item_background"
android:elevation="2dp"
android:paddingLeft="8dp"
android:paddingTop="2dp"
android:paddingRight="8dp"
android:paddingBottom="12dp">
<RelativeLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="3"
android:gravity="bottom">
<EditText
android:id="@+id/address_editText"
style="@style/MyEditTextStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Street address"
android:imeOptions="actionNext"
android:maxLength="100"
android:maxLines="4"
android:importantForAutofill="no"
android:paddingLeft="4dp"
android:paddingTop="8dp"
android:paddingRight="32dp"
android:selectAllOnFocus="true"
android:textSize="@dimen/address_alert_dialog_text_size" />
<ImageButton
android:id="@+id/clear_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:paddingTop="4dp"
android:paddingLeft="4dp"
android:paddingRight="4dp"
android:paddingBottom="0dp"
android:background="?selectableItemBackgroundBorderless"
android:src="@drawable/ic_close_24dp" />
</RelativeLayout>
<EditText
android:id="@+id/enter_address_unit_number_alert_dialog_edit_text"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:layout_marginLeft="16dp"
android:layout_weight="0.8"
android:gravity="center"
android:imeOptions="actionDone"
android:hint="Unit #"
android:importantForAutofill="no"
android:inputType="textPostalAddress|textCapWords|text"
android:maxLength="30"
android:paddingTop="6dp"
android:selectAllOnFocus="true"
android:textSize="@dimen/address_alert_dialog_text_size" />
</LinearLayout>
<ScrollView
android:id="@+id/scrollView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_above="@id/map_button"
android:layout_below="@id/top_LinearLayout">
<!--Single parent to ScrollView-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/no_store_address_enter_address_alert_dialog_text_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="18dp"
android:layout_marginTop="@dimen/address_autocomplete_margin_above_empty_view"
android:layout_marginRight="18dp"
android:textSize="@dimen/address_alert_dialog_no_store_address_text_size"
android:text="You haven't entered a store address. Without this, the app can't locate delivery addresses or calculate driving distances. To fix this, go to Settings and use the 'Store addresses' option."
android:textColor="#F00"
android:visibility="gone" />
<TextView
android:id="@+id/enter_address_alert_dialog_empty_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="18dp"
android:layout_marginTop="@dimen/address_autocomplete_margin_above_empty_view"
android:layout_marginRight="18dp"
android:drawablePadding="6dp"
android:gravity="center_horizontal"
android:padding="12dp"
android:text="Start typing an address above and matching results will show up here"
android:textSize="@dimen/address_alert_dialog_text_size"
app:drawableTint="@color/colorAutocompleteEmptyViewIcon"
app:drawableTopCompat="@drawable/ic_search_white_28dp" />
</LinearLayout>
</ScrollView>
<ListView
android:id="@+id/enter_address_alert_dialog_list_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@id/map_button"
android:layout_below="@id/scrollView"
android:layout_marginLeft="8dp"
android:layout_marginTop="4dp"
android:layout_marginRight="8dp"
android:layout_marginBottom="4dp"
android:divider="@android:color/transparent"
android:dividerHeight="-3dp" />
<TextView
android:id="@+id/map_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentBottom="true"
android:layout_marginLeft="16dp"
android:background="@drawable/toolbar_image_button_ripple"
android:fontFamily="sans-serif-medium"
android:padding="8dp"
android:text="MAP"
android:textColor="@color/colorAlertDialogButton"
android:textSize="@dimen/alert_dialog_button_text_size" />
<TextView
android:id="@+id/cancel_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginRight="15dp"
android:layout_toLeftOf="@id/submit_button"
android:background="@drawable/toolbar_image_button_ripple"
android:fontFamily="sans-serif-medium"
android:padding="8dp"
android:text="CANCEL"
android:textColor="@color/colorAlertDialogButton"
android:textSize="@dimen/alert_dialog_button_text_size" />
<TextView
android:id="@+id/submit_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
android:layout_marginRight="20dp"
android:background="@drawable/toolbar_image_button_ripple"
android:fontFamily="sans-serif-medium"
android:padding="8dp"
android:text="SUBMIT"
android:textColor="@color/colorAlertDialogButton"
android:textSize="@dimen/alert_dialog_button_text_size" />
</RelativeLayout>
没有针对您的问题的“默认”解决方法。你的 Dialog
首先出现,然后 EditText
被绘制,它请求焦点然后键盘显示 - Dialog
已经被绘制(全屏),所以它缩小
也许你可以尝试在 Dialog
出现之前强制显示键盘
((InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE)).
toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);
然后显示您的 Dialog
(可能会有几毫秒的延迟?)并调用 editText.requestFocus()
将键盘“连接”到新显示的 EditText
(会有变化自动完成,因为 EditText
可能会在膨胀时请求焦点)
我能够通过仅在用户开始键入时扩展 AlertDialog 的高度来以令人满意的方式解决此问题。在此处观看视频:https://streamable.com/oj3fbv
addressEditText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
String inputText = s.toString().toLowerCase().trim();
if (inputText.length() > 0) {
if (inputText.length() == 1) {
autocompleteListView.setVisibility(View.VISIBLE);
RelativeLayout.LayoutParams listViewParams = new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.MATCH_PARENT,
RelativeLayout.LayoutParams.MATCH_PARENT);
listViewParams.addRule(RelativeLayout.BELOW, topLinearLayout.getId());
listViewParams.addRule(RelativeLayout.ABOVE, mapButton.getId());
listViewParams.leftMargin = dpToPx(8);
listViewParams.rightMargin = dpToPx(8);
listViewParams.topMargin = dpToPx(4);
listViewParams.bottomMargin = dpToPx(4);
autocompleteListView.setLayoutParams(listViewParams);
RelativeLayout.LayoutParams mapButtonParams = new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.MATCH_PARENT,
RelativeLayout.LayoutParams.WRAP_CONTENT);
mapButtonParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
mapButton.setLayoutParams(mapButtonParams);
}
clearButton.setVisibility(View.VISIBLE);
if (inputText.length() > 1 && storeAddressEntered) {
alertDialogEmptyView.setVisibility(View.GONE);
scrollView.setVisibility(View.GONE);
}
}
alertDialogAdapter.getFilter().filter(inputText);
}
});
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/enter_address_alert_dialog_root_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="4dp">
<TextView
android:id="@+id/title_textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_marginLeft="10dp"
android:layout_marginTop="6dp"
android:paddingLeft="12dp"
android:paddingTop="6dp"
android:paddingBottom="4dp"
android:text="Delivery address"
android:textSize="14dp"
android:textStyle="bold" />
<ImageView
android:id="@+id/network_error_imageView"
android:layout_alignParentRight="true"
android:src="@drawable/cloud_off_36dp"
app:tint="@color/colorError"
android:visibility="gone"
tools:visibility="visible"
android:layout_alignTop="@id/title_textView"
android:layout_alignBottom="@id/title_textView"
android:layout_marginRight="12dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<LinearLayout
android:id="@+id/top_LinearLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:layout_below="@id/title_textView"
android:background="@drawable/autocomplete_list_item_background"
android:elevation="2dp"
android:paddingLeft="8dp"
android:paddingTop="2dp"
android:paddingRight="8dp"
android:paddingBottom="12dp">
<RelativeLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="3"
android:gravity="bottom">
<EditText
android:id="@+id/address_editText"
style="@style/MyEditTextStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Street address"
android:imeOptions="actionNext"
android:maxLength="100"
android:maxLines="4"
android:importantForAutofill="no"
android:paddingLeft="4dp"
android:paddingTop="8dp"
android:paddingRight="32dp"
android:selectAllOnFocus="true"
android:textSize="@dimen/address_alert_dialog_text_size" />
<ImageButton
android:id="@+id/clear_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:paddingTop="4dp"
android:paddingLeft="4dp"
android:paddingRight="4dp"
android:paddingBottom="0dp"
android:background="?selectableItemBackgroundBorderless"
android:src="@drawable/ic_close_24dp" />
</RelativeLayout>
<EditText
android:id="@+id/enter_address_unit_number_alert_dialog_edit_text"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:layout_marginLeft="16dp"
android:layout_weight="0.8"
android:gravity="center"
android:imeOptions="actionDone"
android:hint="Unit #"
android:importantForAutofill="no"
android:inputType="textPostalAddress|textCapWords|text"
android:maxLength="30"
android:paddingTop="6dp"
android:selectAllOnFocus="true"
android:textSize="@dimen/address_alert_dialog_text_size" />
</LinearLayout>
<ScrollView
android:id="@+id/scrollView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/top_LinearLayout">
<!--Single parent to ScrollView-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/no_store_address_enter_address_alert_dialog_text_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="18dp"
android:layout_marginTop="@dimen/address_autocomplete_margin_above_empty_view"
android:layout_marginRight="18dp"
android:textSize="@dimen/address_alert_dialog_no_store_address_text_size"
android:text="You haven't entered a store address. Without this, the app can't locate delivery addresses or calculate driving distances. To fix this, go to Settings and use the 'Store addresses' option."
android:textColor="#F00"
android:visibility="gone" />
<TextView
android:id="@+id/enter_address_alert_dialog_empty_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="18dp"
android:layout_marginRight="18dp"
android:drawablePadding="6dp"
android:gravity="center_horizontal"
android:padding="12dp"
android:text="Start typing an address above and matching results will show up here"
android:textSize="@dimen/address_alert_dialog_text_size"
app:drawableTint="@color/colorAutocompleteEmptyViewIcon"
app:drawableTopCompat="@drawable/ic_search_white_28dp" />
</LinearLayout>
</ScrollView>
<ListView
android:id="@+id/enter_address_alert_dialog_list_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/scrollView"
android:visibility="gone"
android:layout_marginLeft="8dp"
android:layout_marginTop="4dp"
android:layout_marginRight="8dp"
android:layout_marginBottom="4dp"
android:divider="@android:color/transparent"
android:dividerHeight="-3dp" />
<TextView
android:id="@+id/map_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@id/scrollView"
android:layout_marginLeft="16dp"
android:background="@drawable/toolbar_image_button_ripple"
android:fontFamily="sans-serif-medium"
android:padding="8dp"
android:text="MAP"
android:textColor="@color/colorAlertDialogButton"
android:textSize="@dimen/alert_dialog_button_text_size" />
<TextView
android:id="@+id/cancel_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@id/map_button"
android:layout_marginRight="15dp"
android:layout_toLeftOf="@id/submit_button"
android:background="@drawable/toolbar_image_button_ripple"
android:fontFamily="sans-serif-medium"
android:padding="8dp"
android:text="CANCEL"
android:textColor="@color/colorAlertDialogButton"
android:textSize="@dimen/alert_dialog_button_text_size" />
<TextView
android:id="@+id/submit_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignBottom="@id/map_button"
android:layout_marginRight="20dp"
android:background="@drawable/toolbar_image_button_ripple"
android:fontFamily="sans-serif-medium"
android:padding="8dp"
android:text="SUBMIT"
android:textColor="@color/colorAlertDialogButton"
android:textSize="@dimen/alert_dialog_button_text_size" />
</RelativeLayout>