在AlertDialog弹窗中如何缩小message与自定义View之间的垂直间距
问题原因
原生 AlertDialog 的 message 所在容器默认自带底部内边距,同时 setView() 方法添加的自定义控件默认自带顶部外边距,两个属性叠加就产生了偏大的垂直间距。
以下是两种不需要自定义XML布局的优化方案:
方案1:消息文本+输入框合并为纯代码构造的容器(兼容性最好,推荐)
不调用系统的 setMessage() 方法,用代码创建简单的垂直容器承载消息文本和输入框,完全可控间距,无需创建XML布局文件:
AlertDialog.Builder builder = new AlertDialog.Builder(activity); builder.setTitle("foo"); // 构造垂直容器 LinearLayout container = new LinearLayout(activity); container.setOrientation(LinearLayout.VERTICAL); // 设置左右内边距和系统弹窗默认样式对齐,避免视觉错位 int padding = dp2px(activity, 20); container.setPadding(padding, 0, padding, 0); // 构造消息文本,样式和系统默认message保持一致 TextView messageTv = new TextView(activity); messageTv.setText("bar"); messageTv.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16); messageTv.setTextColor(ContextCompat.getColor(activity, android.R.color.darker_gray)); LinearLayout.LayoutParams messageLp = new LinearLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT ); messageLp.topMargin = dp2px(activity, 16); messageLp.bottomMargin = dp2px(activity, 8); // 直接修改这个数值即可调整和输入框的间距 messageTv.setLayoutParams(messageLp); container.addView(messageTv); // 添加输入框 EditText edit = new EditText(activity); container.addView(edit); builder.setView(container); builder.show();
用到的dp转px工具方法:
private int dp2px(Context context, float dpValue) { float scale = context.getResources().getDisplayMetrics().density; return (int) (dpValue * scale + 0.5f); }
方案2:保留系统setMessage,动态调整间距
如果不想自行实现消息文本,可以在弹窗显示后动态修改输入框的顶部边距,抵消系统默认的多余空白:
AlertDialog.Builder builder = new AlertDialog.Builder(activity); builder.setTitle("foo"); builder.setMessage("bar"); EditText edit = new EditText(activity); builder.setView(edit); AlertDialog dialog = builder.show(); // 调整输入框顶部margin,负数即为向上偏移,数值可根据需要自行调整 ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) edit.getLayoutParams(); lp.topMargin = -dp2px(activity, 16); edit.setLayoutParams(lp);
注意:该方案受不同系统版本、不同厂商定制ROM的弹窗默认样式影响,可能存在适配问题,优先选择方案1。
内容的提问来源于stack exchange,提问作者hs1
相关产品推荐
相关产品推荐

