当前位置: 首页 > 知识库问答 >
问题:

如何区分动态创建的edittext和在动态创建的edittext上实现onclick监听器?

罗允晨
2023-03-14

appI预览希望区分我通过单击按钮创建的edittext,并在特定的edittext上实现onclick侦听器

public class MainActivity extends AppCompatActivity
{
    private LinearLayout parentLinearLayout;
    EditText number;
    View rowView;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        number = rowView.findViewById(R.id.number_edit_text);
        parentLinearLayout = (LinearLayout) findViewById(R.id.parent_linear_layout);
    }
    public void onAddField(View v)
    {
        LayoutInflater inflater=(LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        rowView=inflater.inflate(R.layout.field, null);
        // Add the new row before the add field button.
        parentLinearLayout.addView(rowView, parentLinearLayout.getChildCount() - 1);
    }
    public void onDelete(View v)
    {
        parentLinearLayout.removeView((View) v.getParent());
    }
}

共有1个答案

微生宝
2023-03-14

我认为您希望访问RowView的edittext。如果是这样,在添加新行时,您可以为该行设置id,稍后您可以使用该id访问所需行,或者可以通过创建列表并将行添加到列表中,并且无论何时您想访问所需行,都可以通过列表及其位置来访问。访问行的视图后,可以使用它们自己的ID访问子视图(EditTextSpinnerImageView(或Button))。

考虑以下布局是您的布局(您没有共享您的布局,所以我创建了类似的布局)。

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/parent_linear_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginStart="5dp"
    android:layout_marginEnd="5dp"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="onAddField"
        android:layout_gravity="center"
        android:text="Add" />
</LinearLayout>

field.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <EditText
        android:id="@+id/row_edit_text"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toStartOf="@id/row_spinner"
        app:layout_constraintTop_toTopOf="parent"/>
    <Spinner
        android:id="@+id/row_spinner"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintEnd_toStartOf="@id/row_remove"
        app:layout_constraintTop_toTopOf="@id/row_edit_text"
        app:layout_constraintBottom_toBottomOf="@id/row_edit_text"/>
    
    <ImageView
        android:id="@+id/row_remove"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_close"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="@id/row_edit_text"
        app:layout_constraintBottom_toBottomOf="@id/row_edit_text"/>

</androidx.constraintlayout.widget.ConstraintLayout>

第一个选项:为每一行设置id并使用该id访问行。获取行后,您可以使用它自己的ID获取子视图的。

mainactivity.java

 public class MainActivity extends AppCompatActivity {

    private LinearLayout parentLinearLayout;

    //Variable for id and assign it to 0
    int id = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        parentLinearLayout = findViewById(R.id.parent_linear_layout);
    }

    public void onAddField(View view) {
        View v = getLayoutInflater().inflate(R.layout.field, null);

        //Set id for new row
        v.setId(id);

        //Access your ImageView (or Button-I added as ImageView) and set ClickListener 
        // for removing current row with this ImageView (or Button)
        ImageView img = v.findViewById(R.id.row_remove);
        img.setOnClickListener(v1 -> parentLinearLayout.removeView(v));

        //Add your view into the parent layout
        parentLinearLayout.addView(v, parentLinearLayout.getChildCount() - 1);

        //Increase id so every added row will have different id
        id++;
    }

    //This method will return row's EditText. id is the same id which we set while adding
    // new row (don't forget it starts with 0)
    private EditText getRowEditText(int id){
        //Get row's view with its id
        View v = findViewById(id);
        //Access row's EditText
        return v.findViewById(R.id.row_edit_text);
    }

    ////This method will return row's Spinner
    private Spinner getRowSpinner(int id){
        //Get row's view with its id
        View v = findViewById(id);
        //Access row's Spinner
        return v.findViewById(R.id.row_spinner);
    }
}

第二个选项:创建列表并且每当您创建一个新行时,也将该行添加到列表中(使用此选项,您不需要使用id)。

public class MainActivity extends AppCompatActivity {

    private LinearLayout parentLinearLayout;
    private List<View> list;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        parentLinearLayout = findViewById(R.id.parent_linear_layout);
        list = new ArrayList<>();
    }

    public void onAddField(View view) {
        View v = getLayoutInflater().inflate(R.layout.field, null);

        ImageView img = v.findViewById(R.id.row_remove);
        img.setOnClickListener(v1 -> parentLinearLayout.removeView(v));

        parentLinearLayout.addView(v, parentLinearLayout.getChildCount() - 1);

        //Add current row into the list
        list.add(v);
    }

    private EditText getRowEditText(int position){
        //Get row's view with its position
        View v = list.get(position);
        //Return row's EditText
        return v.findViewById(R.id.row_edit_text);
    }

    private Spinner getRowSpinner(int position){
        //Get row's view with its position
        View v = list.get(position);
        //Return row's EditText
        return v.findViewById(R.id.row_spinner);
    }
}
 类似资料:
  • 问题内容: 我正在尝试使用HiveCLI上的动态分区从另一个表创建一个新表。我正在从Hive官方Wiki学习,这里有以下示例: 但是我收到了这个错误: 失败:SemanticException [错误10065]: CREATE TABLE AS SELECT命令无法指定目标表的列列表 资料来源:https : //cwiki.apache.org/confluence/display/Hive/

  • 我有一个rabbitListener,它连续异步地侦听队列“用户消息”的用户消息。除非队列中加载了大量消息,否则一切都正常。当消息批量发布到队列时,同一用户的消息首先被处理,从而其他用户的消息等待轮到他们。 我无法使用优先级队列,因为所有用户的优先级都相同。所以我想创建新的队列,并在运行时监听它们。一旦消息被使用,所有队列都将是短暂的。(队列将被删除) 在浏览时,我发现可以使用RabbitAdmi

  • 我已经阅读了讨论这个问题的其他问题,除了创建的第一个问题之外,它们都适用于我的布局。 目前,这是我的方法的顶部: ^这使得它至少键盘不会在启动时弹出,但仍然专注于。 这是我的的: 这是我提起我的活动时的样子: 问题是,对于某些手机,当像这样聚焦时,它们无法在其中写入。我希望它不对焦。 我所做的工作适用于接下来提出的布局,因为<code>编辑文本 请注意,它的布局是相同的。这是用户返回此屏幕后的屏幕

  • 问题内容: 我在使用primefaces树实现实现动态树结构时遇到了一些麻烦。在primeface提供的展示柜中,代码的结构如下所示。但是,这是非常静态的。我试图弄清楚如何处理从数据库中获取的数据,在编译时树的深度是未知的。 我以为我可能需要某种递归方法来实现此目的,但我无法完全理解实现的样子。 有什么想法吗? 以下是primefaces的示例代码 问题答案:

  • 我有一个按钮和一个文本框。当我在textbox中放置一个值并单击此按钮时,将创建一个新按钮,该值填充在textbox中,但我希望当我再次单击Button1时,应该还有一个按钮,或者我们可以说如何移动上一个按钮的位置? 请帮我解决这个问题。提前谢了。

  • 问题内容: 你好,我有这个设置 我需要为每个按钮获取以下内容 在Java中是否可以为我声明的每个按钮动态创建此按钮?因为当我有5个按钮时,我不需要3x5 = 15行代码,而是只有几行具有动态创建的按钮。 问题答案: 编写一个小循环并将您的按钮存储在数组中: