如何去除EditText气泡下方边框?WindowManager添加布局问题解决
我之前也碰到过类似的场景,用WindowManager.addView动态添加EditText的时候,确实会出现这种奇怪的边框问题,而且常规的popupBackground设置完全不生效,下面给你几个亲测可行的解决方案:
解决方案1:自定义输入法候选框样式
问题根源在于通过WindowManager添加的View没有继承App的主题样式,默认用了系统自带的候选框样式(带边框)。你可以自定义一个无框的弹出样式,再通过代码绑定给EditText:
- 第一步,在
res/values/styles.xml里添加自定义样式:
<style name="NoBorderInputPopup" parent="Widget.AppCompat.PopupWindow"> <item name="android:background">@android:color/transparent</item> <item name="android:borderWidth">0dp</item> <item name="android:shadowRadius">0</item> </style>
- 第二步,在创建EditText时设置这个样式(一定要在
addView之前操作):
EditText editText = new EditText(context); // 绑定自定义候选框样式 editText.setPopupBackgroundResource(R.style.NoBorderInputPopup); // 额外开启覆盖模式,避免候选框挤压布局 editText.setInputMethodMode(EditText.INPUT_METHOD_MODE_OVERLAY);
如果某些机型对setPopupBackgroundResource支持不好,直接给候选框设置透明背景也能生效:
editText.setPopupBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
解决方案2:给EditText绑定App主题的Context
WindowManager添加的View默认用系统主题,和App内的样式脱节。你可以用带App主题的Context创建EditText,让它继承App的输入框样式:
// 用App主题包装原始Context Context themedContext = new ContextThemeWrapper(context, R.style.AppTheme); EditText editText = new EditText(themedContext);
如果你的App主题里已经配置了输入框候选框为透明,这个方法会更省心,还能保证样式统一。
应急方案:无法去边框时让文本可见
如果上面的方法都因为ROM定制失效,那可以用调整布局的方式让文本避开边框:
- 方法A:给EditText添加上内边距,把文本向上偏移:
// 给顶部加8dp内边距,根据实际边框高度调整数值 editText.setPadding( editText.getPaddingLeft(), editText.getPaddingTop() + 8, editText.getPaddingRight(), editText.getPaddingBottom() );
- 方法B:监听输入法弹出事件,动态调整EditText位置:
editText.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { Rect visibleFrame = new Rect(); editText.getWindowVisibleDisplayFrame(visibleFrame); int screenHeight = editText.getRootView().getHeight(); int keyboardHeight = screenHeight - visibleFrame.bottom; if (keyboardHeight > 0) { // 输入法弹出时,把EditText向上挪,避开候选框边框 WindowManager.LayoutParams params = (WindowManager.LayoutParams) editText.getLayoutParams(); params.y -= keyboardHeight / 3; windowManager.updateViewLayout(editText, params); } } });
额外提醒
部分国产ROM对输入法候选框做了深度定制,可能需要多机型测试适配;如果用的是AppCompatEditText,记得用AppCompat系列的样式作为父类(比如Widget.AppCompat.EditText)。
内容的提问来源于stack exchange,提问作者elephant16
相关产品推荐
相关产品推荐

