You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android编程实现每行5个EditText方框布局及输入值获取

Android 多行带方框EditText布局实现求助

需求:实现多个带方框样式的EditText,要求每行显示5个,最多支持15个,同时能将用户输入内容提取为String数组。目前代码实现后未达到预期效果,寻求帮助。

现有代码

EditText[] et = new EditText[count];
LinearLayout linearLayout = new LinearLayout(this);
linearLayout.setLayoutParams(new LinearLayout.LayoutParams(
        ViewGroup.LayoutParams.MATCH_PARENT,
        ViewGroup.LayoutParams.WRAP_CONTENT));
linearLayout.setOrientation(LinearLayout.HORIZONTAL);
LinearLayout layout = (LinearLayout) findViewById(R.id.dynamicsletters);
for (int i = 0; i < count; i++) {
    et[i] = new EditText(this);
    et[i].setLayoutParams(new LinearLayout.LayoutParams(
            0, ViewGroup.LayoutParams.WRAP_CONTENT, 1.0f
    ));
    //et[i].setPadding(10,0,0,0);
    et[i].setGravity(Gravity.CENTER_VERTICAL);
    et[i].setHint("Pos"+(i+1));

    //et[i].setWidth(40);//.layout(100,0,0,0);
    et[i].setBackgroundResource(R.drawable.rectangleborder);
    linearLayout.addView(et[i]);
}
layout.addView(linearLayout);

当前效果

15个EditText的当前效果

预期效果

每行5个EditText的预期布局


解决方案

1. 修复布局逻辑(实现每行5个)

你现在的问题是把所有EditText都塞进了同一个横向LinearLayout,导致全部挤在一行。需要在循环里判断,每添加5个就新建一行横向布局,再把这行布局加到父容器里。

修改后的代码示例:

int count = 15; // 最多15个,可按需调整
EditText[] et = new EditText[count];
LinearLayout parentLayout = findViewById(R.id.dynamicsletters);
parentLayout.setOrientation(LinearLayout.VERTICAL); // 确保父布局是垂直方向

for (int i = 0; i < count; i++) {
    // 每5个EditText新建一行横向布局
    if (i % 5 == 0) {
        LinearLayout rowLayout = new LinearLayout(this);
        rowLayout.setLayoutParams(new LinearLayout.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.WRAP_CONTENT));
        rowLayout.setOrientation(LinearLayout.HORIZONTAL);
        rowLayout.setPadding(0, 10, 0, 10); // 可选:增加行间距,让布局更舒展
        parentLayout.addView(rowLayout);
    }

    et[i] = new EditText(this);
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
            0, ViewGroup.LayoutParams.WRAP_CONTENT, 1.0f);
    params.setMargins(5, 0, 5, 0); // 可选:增加EditText之间的间距
    et[i].setLayoutParams(params);
    
    et[i].setGravity(Gravity.CENTER); // 改为居中对齐,更贴合预期效果
    et[i].setHint("Pos" + (i+1));
    et[i].setBackgroundResource(R.drawable.rectangleborder);
    // 限制每个EditText只能输入1个字符,适配方框样式
    et[i].setFilters(new InputFilter[]{new InputFilter.LengthFilter(1)});

    // 获取当前行的布局,把EditText加进去
    LinearLayout currentRow = (LinearLayout) parentLayout.getChildAt(parentLayout.getChildCount() - 1);
    currentRow.addView(et[i]);
}

2. 提取输入内容到String数组

写个简单方法就能批量获取所有EditText的输入值:

private String[] getEditTextValues(EditText[] editTexts) {
    String[] values = new String[editTexts.length];
    for (int i = 0; i < editTexts.length; i++) {
        values[i] = editTexts[i].getText().toString().trim();
    }
    return values;
}

使用示例:

// 需要获取输入时调用
String[] inputValues = getEditTextValues(et);

额外提示

  • 确保XML里的R.id.dynamicsletters是垂直方向的LinearLayout,否则行布局会乱排。
  • 可以通过setMargins和setPadding调整间距,让布局更美观。
  • 加InputFilter.LengthFilter(1)限制输入长度,更符合方框输入的场景。

内容的提问来源于stack exchange,提问作者SNAD

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 12:37:39