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

Android动态生成EditText与Button异常求助:点击按钮重复生成控件

解决Android动态添加班级控件的重复生成问题

嘿,我明白你现在的困扰——每次点击「添加新班级」按钮,居然生成了60个按钮,完全不符合你“每次点击只加一组输入框和按钮”的需求对吧?咱们来快速修复这个问题,核心问题出在你循环遍历超长数组的逻辑上,一步步调整就好:

问题根源

在你的addNewClassSetUp()方法里,你创建了一个包含60个元素的arrayClass数组,然后用for循环遍历整个数组来创建按钮,这就导致每次点击都会批量生成60个按钮,而不是你想要的单个控件组。

修复方案

我们需要修改addNewClassSetUp()方法,让它每次执行只创建一个EditText和一个新的「添加新班级」按钮,同时给新按钮绑定正确的点击事件,让它也能触发添加操作。另外可以把每个班级的输入框和按钮放在同一个LinearLayout里,让布局更整洁有序。

修改后的完整代码

package com.example.demeainc.demea;
import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.view.View;
import android.widget.Toast;

public class SchoolSearchSetup extends AppCompatActivity implements View.OnClickListener {
    private EditText searchSchoolID;
    private Button searchSchoolButtonID;
    private ListView listOfSchoolsID;
    private Button openNewschoolID;
    private LinearLayout schoolSetupLayout;
    private Button addNewClass;
    private EditText classNameEditText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_school_search_setup);
        findAllViewsID();
        initializeListenners();
    }

    public void findAllViewsID(){
        classNameEditText = findViewById(R.id.classNameText);
        addNewClass = findViewById(R.id.addNewClassButton);
        schoolSetupLayout = findViewById(R.id.schoolSetupLayout);
        searchSchoolID = findViewById(R.id.searchSchoolID);
        searchSchoolButtonID = findViewById(R.id.searchSchoolButtonID);
        listOfSchoolsID = findViewById(R.id.listOfSchoolsID);
        openNewschoolID = findViewById(R.id.openNewschoolID);
    }

    public void initializeListenners(){
        openNewschoolID.setOnClickListener(SchoolSearchSetup.this);
        addNewClass.setOnClickListener(SchoolSearchSetup.this);
    }

    @Override
    public void onClick(View view) {
        switch(view.getId()){
            case R.id.openNewschoolID:
                displaySchoolSetUpForms();
                break;
            case R.id.addNewClassButton:
                addNewClassSetUp();
                break;
        }
    }

    private void addNewClassSetUp() {
        // 为每个班级创建单独的横向布局,包含输入框和添加按钮
        LinearLayout classItemLayout = new LinearLayout(this);
        classItemLayout.setOrientation(LinearLayout.HORIZONTAL);
        LinearLayout.LayoutParams itemLayoutParams = new LinearLayout.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.WRAP_CONTENT
        );
        itemLayoutParams.setMargins(0, 10, 0, 0);
        classItemLayout.setLayoutParams(itemLayoutParams);
        classItemLayout.setGravity(Gravity.CENTER_VERTICAL);
        schoolSetupLayout.addView(classItemLayout);

        // 创建班级名称输入框
        LinearLayout.LayoutParams editTextParams = new LinearLayout.LayoutParams(
                0,
                ViewGroup.LayoutParams.WRAP_CONTENT,
                1 // 设置权重让输入框占满剩余空间
        );
        editTextParams.setMarginEnd(10);
        EditText addClassEditTex = new EditText(this);
        addClassEditTex.setHint("Class name, e.g Grade one");
        addClassEditTex.setLayoutParams(editTextParams);
        classItemLayout.addView(addClassEditTex);

        // 创建新的「添加新班级」按钮
        LinearLayout.LayoutParams addNewClassButtonParams = new LinearLayout.LayoutParams(
                ViewGroup.LayoutParams.WRAP_CONTENT,
                ViewGroup.LayoutParams.WRAP_CONTENT
        );
        Button newAddButton = new Button(this);
        newAddButton.setGravity(Gravity.CENTER);
        newAddButton.setBackgroundResource(R.color.colorPrimaryDark);
        newAddButton.setText("Add New Class");
        newAddButton.setTextColor(Color.WHITE);
        newAddButton.setLayoutParams(addNewClassButtonParams);
        // 给新按钮绑定点击事件,直接调用添加方法
        newAddButton.setOnClickListener(v -> addNewClassSetUp());
        classItemLayout.addView(newAddButton);

        Toast.makeText(this, "New class field created scroll down to view", Toast.LENGTH_LONG).show();
    }

    private void displaySchoolSetUpForms() {
        schoolSetupLayout.setVisibility(View.VISIBLE);
    }
}

关键修改点说明

  1. 移除多余的数组和循环:删掉了arrayClass数组和遍历它的for循环,现在每次调用addNewClassSetUp()只会生成一组输入框和按钮。
  2. 优化布局结构:把每个班级的输入框和按钮放在同一个横向LinearLayout里,设置边距和权重让界面更美观整洁。
  3. 简化点击事件绑定:新创建的按钮直接通过Lambda表达式绑定addNewClassSetUp()方法,实现无限添加的效果——点击任何「添加新班级」按钮都会生成新的控件组。
  4. 移除无效判断:schoolSetupLayout是布局中初始化的控件,不会为空,所以去掉了不必要的空判断逻辑。

现在测试一下:点击初始按钮会生成一组新控件,点击新生成的按钮又会添加下一组,完全符合你的需求啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:10:00