AlertDialog中AutoCompleteTextView下拉框被键盘遮挡,如何设置向上显示?
解决AlertDialog中AutoCompleteTextView下拉列表被键盘遮挡的问题
嘿,我之前也碰到过这个坑!在AlertDialog里用AutoCompleteTextView的时候,默认下拉框往下弹,键盘一出来就把选项挡住了,根本没法选。下面给你几个简单有效的办法,让下拉框向上展开,完美避开键盘:
问题根源
AutoCompleteTextView默认会在控件下方弹出下拉列表,但AlertDialog本身是悬浮窗口,当软键盘弹出后,底部的空间被占满,下拉列表自然就被挡住了。我们要做的就是强制让下拉列表往控件上方展开。
方法1:直接设置下拉偏移量(最省心)
在你初始化AutoCompleteTextView的代码后面,加几行代码调整下拉框的位置就行。不过要注意,如果视图还没完成测量,直接拿高度可能是0,所以最好加个监听确保拿到正确的高度:
String[] courseList = new String[]{ "BE/B-Tech", "M-Tech","B.sc","M.sc" }; ArrayAdapter<String> courseListAdapter = new ArrayAdapter<String>(ProfileActivity.this,R.layout.activity_dropdownlistitems,R.id.list_item,courseList); AutoCompleteTextView selectDistrict = (AutoCompleteTextView)alertDailogView.findViewById(R.id.auto2); selectDistrict.setAdapter(courseListAdapter); // 关键:让下拉框向上展开,偏移量设为负的控件自身高度 selectDistrict.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { // 把下拉框往上挪,刚好在控件上方显示 selectDistrict.setDropDownVerticalOffset(-selectDistrict.getHeight()); // 监听只执行一次,避免重复调用 selectDistrict.getViewTreeObserver().removeOnGlobalLayoutListener(this); } });
方法2:自定义Adapter控制下拉窗口
如果你想更灵活地控制下拉框的样式和位置,可以自定义一个ArrayAdapter,在里面配置下拉PopupWindow的属性:
// 自定义Adapter,继承自ArrayAdapter public class CustomDropdownAdapter extends ArrayAdapter<String> { public CustomDropdownAdapter(Context context, int resource, int textViewId, String[] items) { super(context, resource, textViewId, items); } @Override public View getView(int position, View convertView, ViewGroup parent) { View view = super.getView(position, convertView, parent); if (parent instanceof AutoCompleteTextView) { AutoCompleteTextView actv = (AutoCompleteTextView) parent; PopupWindow popupWindow = actv.getDropDownPopupWindow(); if (popupWindow != null) { // 设置下拉窗口在控件上方显示,偏移量为负的控件高度 popupWindow.setVerticalOffset(-actv.getHeight()); // 还可以自定义下拉的动画样式(需要在styles.xml中定义) popupWindow.setAnimationStyle(R.style.DropdownAboveAnimation); } } return view; } } // 替换你原来的Adapter使用自定义的 CustomDropdownAdapter courseListAdapter = new CustomDropdownAdapter(ProfileActivity.this,R.layout.activity_dropdownlistitems,R.id.list_item,courseList); selectDistrict.setAdapter(courseListAdapter);
额外优化小技巧
除了上面的方法,你还可以给AlertDialog设置软键盘调整模式,让Dialog随键盘弹出自动调整大小,进一步减少遮挡概率:
AlertDialog alertDialog = builder.create(); // 让Dialog跟着键盘调整大小 alertDialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); alertDialog.show();
另外,在XML布局里给AutoCompleteTextView加上这两个属性,也能让下拉列表的显示更合理:
<AutoCompleteTextView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/auto2" android:completionThreshold="1" android:dropDownHeight="wrap_content" android:dropDownWidth="match_parent"/>
内容的提问来源于stack exchange,提问作者surendra
相关产品推荐
相关产品推荐

