AlertDialog中如何添加两个带区分副标题的EditText输入框
实现结论
完全可以在现有AlertDialog的EditText下方新增第二个带对应副标题的输入框,不需要更换弹窗组件,只需要调整传入setView()的内容结构即可。
具体实现逻辑
- 原有写法是直接把单个EditText传入
setView(),而setView()本身支持接收任意View实例,因此可以先创建一个垂直方向的LinearLayout作为容器,把所有内容按顺序装进去再传给弹窗 - 每个输入框上方新增一个TextView作为副标题,用来标注当前输入框的用途
- 给容器设置合适的左右内边距,避免控件贴到弹窗边缘,和系统原生弹窗的内容边距保持一致
- 把原有输入框的布局高度从
MATCH_PARENT改成WRAP_CONTENT,避免第一个输入框占满整个弹窗内容区把第二个输入框挤出可视范围 - 提交逻辑里记得补充获取第二个输入框的内容,传入你的Request实体类
修改后的完整代码
private void showAlertDialog() { AlertDialog.Builder alertDialog = new AlertDialog.Builder(Cart.this); alertDialog.setTitle("Requests:"); alertDialog.setMessage("(Condiments,napkins, take-out orders or such can also be requested here)"); alertDialog.setIcon(R.drawable.ic_shopping_cart_black_24dp); // 创建垂直方向的线性布局作为内容容器 LinearLayout container = new LinearLayout(Cart.this); container.setOrientation(LinearLayout.VERTICAL); // 设置和原生弹窗匹配的内边距,用dp单位避免不同分辨率下显示异常 int paddingHor = dp2px(20); container.setPadding(paddingHor, 0, paddingHor, 0); LinearLayout.LayoutParams itemLp = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT ); // 第一个输入框+对应副标题 TextView tvAddressLabel = new TextView(Cart.this); tvAddressLabel.setText("配送地址"); // 替换为第一个输入框的实际用途说明 tvAddressLabel.setTextSize(14); tvAddressLabel.setTextColor(0xFF666666); // 次级文字灰色,和输入内容做层级区分 tvAddressLabel.setLayoutParams(itemLp); final EditText edtAddress = new EditText(Cart.this); edtAddress.setLayoutParams(itemLp); edtAddress.setHint("请输入配送地址"); // 可按需配置输入提示 // 第二个输入框+对应副标题,加顶部间距和第一个输入块拉开距离 TextView tvRefLabel = new TextView(Cart.this); tvRefLabel.setText("订单参考/备注"); // 替换为第二个输入框的实际用途说明 tvRefLabel.setTextSize(14); tvRefLabel.setTextColor(0xFF666666); LinearLayout.LayoutParams refLabelLp = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT ); refLabelLp.topMargin = dp2px(16); tvRefLabel.setLayoutParams(refLabelLp); final EditText edtRef = new EditText(Cart.this); edtRef.setLayoutParams(itemLp); edtRef.setHint("请输入参考信息或其他备注"); // 可按需配置输入提示 // 按从上到下的顺序把控件加入容器 container.addView(tvAddressLabel); container.addView(edtAddress); container.addView(tvRefLabel); container.addView(edtRef); // 把整个容器传给setView,替代原来的单个EditText alertDialog.setView(container); alertDialog.setPositiveButton("Confirm", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //Create new Request Request request = new Request( Common.currentTable.getTablet(), edtAddress.getText().toString(), edtRef.getText().toString(), // 按需调整参数位置,匹配你自己的Request构造方法 txtTotalPrice.getText().toString(), cart ); // Submit to Firebase requests.child(String.valueOf(System.currentTimeMillis())) .setValue(request); //Delete cart new Database(getBaseContext()).cleanCart(); Toast.makeText(Cart.this, "Order Placed Thank You and Kindly Wait for your Order.", Toast.LENGTH_LONG).show(); finish(); } }); alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); alertDialog.show(); } // dp转px工具方法,保证不同设备上边距、尺寸显示一致 private int dp2px(int dpValue) { float scale = getResources().getDisplayMetrics().density; return (int) (dpValue * scale + 0.5f); }
注意:代码里的副标题文字、输入框hint、Request构造的参数顺序需要根据实际业务字段调整,避免参数错位。
内容的提问来源于stack exchange,提问作者ill
相关产品推荐
相关产品推荐

