获得动态创建的Spinner和EditText视图的价值

时间:2018-05-30 05:41:01

标签: java android

我创建了一个动态按钮,每次点击都会添加一个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...

有没有办法实现这个目标?

3 个答案:

答案 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。相反,您可以使用setTaggetTag。您可以使用以下内容轻松使用它:

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值指定给任何视图作为标记 这可能对你有帮助 快乐的编码...