Android Studio:新手求教获取动态创建控件的用户输入(需最小可行示例)
嘿,刚接触Android Studio很正常,别慌!我来帮你搞定动态控件获取输入的问题~
首先得指出你当前代码的核心问题:动态创建的EditText没法用findViewById找,因为它们是运行时生成的,没有在XML里定义固定ID,而且你创建的editText1没有被保存下来,之后根本没法引用它。
下面给你一个完整的最小可行示例(MWE),包含动态创建控件、保存引用、获取输入的完整流程:
第一步:修改Activity代码
我们会用一个全局集合来保存所有动态创建的EditText,这样后续就能随时读取它们的输入内容:
public class MainActivity extends AppCompatActivity { // 全局集合,专门存动态创建的EditText private ArrayList<EditText> dynamicEditTexts = new ArrayList<>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } // 你的点击方法,用来生成动态控件 public void click(View view) { TableLayout tl = findViewById(R.id.tableLayout1); // 可选:清空之前的动态控件,避免重复添加 if (tl.getChildCount() > 1) { tl.removeViews(1, tl.getChildCount() - 1); dynamicEditTexts.clear(); } // 创建初始行(你原来的代码) TableRow row = new TableRow(this); TextView tv = new TextView(this); tv.setText("This is text"); row.addView(tv); tl.addView(row); // 生成带EditText的动态行 for (int x = 0; x < 5; x++) { String col1 = "(" + x + ")" + Integer.toBinaryString(x); TableRow newRow = new TableRow(this); // 第一列文本 TextView column1 = new TextView(this); column1.setText(col1); // 动态创建EditText EditText editText1 = new EditText(this); // 给EditText加个布局参数,让它适配宽度 editText1.setLayoutParams(new TableRow.LayoutParams( TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT, 1f )); editText1.setHint("请输入内容"); // 第三列文本 TextView column3 = new TextView(this); column3.setText("1"); // 添加控件到行,再把行加到表格里 newRow.addView(column1); newRow.addView(editText1); newRow.addView(column3); tl.addView(newRow); // 关键:把这个EditText存到全局集合里! dynamicEditTexts.add(editText1); } } // 新增一个点击方法,用来获取所有输入内容 public void fetchInputs(View view) { StringBuilder allInputs = new StringBuilder(); // 遍历集合,逐个读取EditText的输入 for (int i = 0; i < dynamicEditTexts.size(); i++) { EditText et = dynamicEditTexts.get(i); // getText()返回Editable,转成String才能拿到文本,trim()去掉前后空格 String input = et.getText().toString().trim(); allInputs.append("第").append(i+1).append("个输入框:").append(input).append("\n"); } // 用Toast显示结果,你也可以把内容存到变量、上传服务器等 Toast.makeText(this, allInputs.toString(), Toast.LENGTH_LONG).show(); } }
第二步:对应的XML布局(activity_main.xml)
需要两个按钮(一个创建控件,一个获取输入)和一个TableLayout:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="16dp"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="创建动态控件" android:onClick="click"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="获取输入内容" android:onClick="fetchInputs" android:layout_marginTop="16dp"/> <!-- 加ScrollView避免控件太多溢出屏幕 --> <ScrollView android:layout_width="match_parent" android:layout_height="match_parent"> <TableLayout android:id="@+id/tableLayout1" android:layout_width="match_parent" android:layout_height="wrap_content"/> </ScrollView> </LinearLayout>
关键知识点解释
为什么用ArrayList?
动态创建的EditText没有固定ID,没法用findViewById定位,所以创建时把它们存到全局集合里,后续就能随时调用。正确获取输入的方法
用editText.getText().toString()就够了:getText()返回Editable对象,是EditText的输入内容载体- 调用
toString()转成普通字符串,方便后续处理 - 加
trim()可以去掉用户输入的前后空格,避免空内容干扰
代码放哪里?
获取输入的代码可以放在任何触发时机:- 按钮点击(比如示例里的
fetchInputs方法) - 页面销毁前
- 提交数据的逻辑里
- 按钮点击(比如示例里的
不要用
getText(this)或editText(this),这些都不是Android SDK里的正确方法,完全没必要~
内容的提问来源于stack exchange,提问作者user1642683
相关产品推荐
相关产品推荐

