如何获取动态创建的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
相关产品推荐
相关产品推荐

