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

如何获取动态创建的Spinner与EditText值并设置指定格式ID?

如何为动态添加的EditText和Spinner设置格式化标识?

问题描述

我创建了一个动态按钮,点击时会添加Spinner和EditText视图,需要获取这两个控件的值。现有addRow()方法代码如下:

public void addRow() { 
    LinearLayout ingrediantLayout = findViewById(R.id.ingrediant_linear_layout); 
    //add edit text 
    EditText ingrediantEditText = new EditText(this); 
    Spinner ingrediantSpinner = new Spinner(this); 
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
    ingrediantEditText.setLayoutParams(params); 
    ingrediantSpinner.setLayoutParams(params); 
    ingrediantEditText.setText(""); 
    ingrediantEditText.setHint(R.string.ingrediant_value); 
    ingrediantSpinner.setSelection(0); 
    //create an id for each view 
    ingrediantEditText.setId(ingrediante_weight + 1); 
    ingrediantSpinner.setId(ingrediante_type + 1); 
    //add the views in order of appearance 
    ingrediantLayout.addView(ingrediantSpinner); 
    ingrediantLayout.addView(ingrediantEditText); 
    Log.i(LOG_TAG, "Ingredient Weight Id " + ingrediantEditText.getId()); 
    ingrediante_weight++; 
    ingrediante_type++; 
} 

希望每次调用addRow()方法时,控件能按以下格式标识:

ingrediante_weight_1 | ingrediante_type_1 
ingrediante_weight_2 | ingrediante_type_2 
etc... 

请问是否有实现该需求的方法?


解决方案

首先得明确:Android中View的setId()方法只接受int类型的参数,没办法直接设置你想要的字符串格式ID。不过我们可以用setTag()方法来实现类似的标识效果——这是官方推荐的给View附加自定义信息的方式,完全能满足你的需求。

下面是修改后的addRow()方法,用标签来标记每一组控件:

// 定义一个全局计数器,用来记录当前是第几行
private int rowCounter = 0;

public void addRow() {
    LinearLayout ingrediantLayout = findViewById(R.id.ingrediant_linear_layout);
    
    // 创建EditText和Spinner
    EditText ingrediantEditText = new EditText(this);
    Spinner ingrediantSpinner = new Spinner(this);
    
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
        LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
    ingrediantEditText.setLayoutParams(params);
    ingrediantSpinner.setLayoutParams(params);
    
    ingrediantEditText.setText("");
    ingrediantEditText.setHint(R.string.ingrediant_value);
    ingrediantSpinner.setSelection(0);
    
    // 递增计数器,生成当前行的标识
    rowCounter++;
    String weightTag = "ingrediante_weight_" + rowCounter;
    String typeTag = "ingrediante_type_" + rowCounter;
    
    // 给控件设置自定义标签
    ingrediantEditText.setTag(weightTag);
    ingrediantSpinner.setTag(typeTag);
    
    // 同时可以生成唯一的int ID(可选,用于系统级的View查找)
    ingrediantEditText.setId(View.generateViewId());
    ingrediantSpinner.setId(View.generateViewId());
    
    // 添加到布局中
    ingrediantLayout.addView(ingrediantSpinner);
    ingrediantLayout.addView(ingrediantEditText);
    
    Log.i(LOG_TAG, "Ingredient Weight Tag: " + weightTag);
    Log.i(LOG_TAG, "Ingredient Type Tag: " + typeTag);
}

如何获取控件的值

之后你可以通过遍历布局里的子View,根据标签来区分控件并获取对应的值:

// 获取所有动态添加的控件的值
public void collectIngredientValues() {
    LinearLayout ingrediantLayout = findViewById(R.id.ingrediant_linear_layout);
    for (int i = 0; i < ingrediantLayout.getChildCount(); i++) {
        View view = ingrediantLayout.getChildAt(i);
        if (view.getTag() == null) continue;
        
        String tag = view.getTag().toString();
        // 根据标签判断控件类型和所属行
        if (tag.startsWith("ingrediante_weight_")) {
            EditText weightEt = (EditText) view;
            String weightValue = weightEt.getText().toString().trim();
            int rowNum = Integer.parseInt(tag.split("_")[2]);
            Log.i(LOG_TAG, "第" + rowNum + "行重量:" + weightValue);
            // 这里可以把值存储到集合或其他地方
        } else if (tag.startsWith("ingrediante_type_")) {
            Spinner typeSp = (Spinner) view;
            String typeValue = typeSp.getSelectedItem().toString();
            int rowNum = Integer.parseInt(tag.split("_")[2]);
            Log.i(LOG_TAG, "第" + rowNum + "行类型:" + typeValue);
        }
    }
}

补充说明

如果你一定要用int类型的ID来关联自定义标识,可以维护一个HashMap<String, Integer>来存储标签和ID的映射,但用标签的方式更直接、更灵活,完全能满足你区分控件并获取值的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:12:22