我创建了一个动态按钮,每次点击都会添加一个Spinner和EditText视图,我需要获取两个字段的值。
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()时都将id设置为
ingrediante_weight_1 | ingrediante_type_1
ingrediante_weight_2 | ingrediante_type_2
etc...
有没有办法实现这个目标?
答案 0 :(得分:1)
您无法将字符串添加为视图的ID。 View类只有方法setId(int)。但是有一种方法可以处理这个问题(尽管这样也只能用整数处理id,但是你可以用一种方法给视图提供一些有意义的id(使用字符串)。
您可以通过将id声明为xml并将其用于java代码来实现。如下所示
<resources>
<item type="id" name="ingrediante_weight_1" />
<item type="id" name="ingrediante_type_1" />
</resources>
在以编程方式设置id时,您可以使用这些
ingrediantEditText.setId(R.id.ingrediante_weight1);
ingrediantSpinner.setId(R.id.ingrediante_type1);
答案 1 :(得分:1)
您无法将字符串添加为视图的ID。相反,您可以使用setTag和getTag。您可以使用以下内容轻松使用它:
ingrediantEditText.setTag("ingrediante_weight_1");
ingrediantSpinner.setTag("ingrediante_type_1");
虽然像@ tim-biegeleisen所说,但做上述事情似乎是多余的。因为您可以通过将所有动态添加的视图添加到列表中来处理它们:
private List<EditText> mIngrediantEditTexts = new ArrayList<>();
private List<Spinner> mIngrediantSpinners = new ArrayList<>();
public void addRow() {
...
EditText ingrediantEditText = new EditText(this);
Spinner ingrediantSpinner = new Spinner(this);
...
mIngrediantEditTexts.add(ingrediantEditText);
mIngrediantSpinners.addd(ingrediantSpinner);
...
}
您可以按位置访问每个项目作为ID。
答案 2 :(得分:0)
您可以为视图设置标记,如下所示
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);
//Code for setting tags
ingrediantEditText.setTag(String.valueOf(ingrediante_weight + 1));
ingrediantSpinner.setTag(String.valueOf(ingrediante_weight + 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++;
}
我们可以将任何对象设置为要查看的标记,因此我们可以将interger或string值指定给任何视图作为标记 这可能对你有帮助 快乐的编码...