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); } }
关键修改点说明
- 移除多余的数组和循环:删掉了
arrayClass数组和遍历它的for循环,现在每次调用addNewClassSetUp()只会生成一组输入框和按钮。 - 优化布局结构:把每个班级的输入框和按钮放在同一个横向LinearLayout里,设置边距和权重让界面更美观整洁。
- 简化点击事件绑定:新创建的按钮直接通过Lambda表达式绑定
addNewClassSetUp()方法,实现无限添加的效果——点击任何「添加新班级」按钮都会生成新的控件组。 - 移除无效判断:
schoolSetupLayout是布局中初始化的控件,不会为空,所以去掉了不必要的空判断逻辑。
现在测试一下:点击初始按钮会生成一组新控件,点击新生成的按钮又会添加下一组,完全符合你的需求啦!
内容的提问来源于stack exchange,提问作者Aham_Uzoma
相关产品推荐
相关产品推荐

