如何为许多以编程方式添加的视图设置 onclicklistener 按钮在哪里

how to set onclicklistener for many programatically added views where are buttons

我有 table 布局,其中的行添加了不同的视图(其中有按钮另一个 table 视图和...)根据我输入的数据多次... 但每一行都应该是可移动的或通过该视图中的按钮删除table。

所以我的问题是:我怎样才能到达这些按钮并在它们上面设置 onclick 侦听器,它会知道这次点击来自哪里,以便我能够根据另一个按钮对该行进行操作 xml

我说的table是这样的:

<ScrollView
        android:id="@+id/main_orders_scroll_view"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_toStartOf="@+id/middle"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toStartOf="@+id/header"
        app:layout_constraintHorizontal_bias="1.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="@+id/middle"
        app:layout_constraintVertical_bias="0.0" >
        <TableLayout
            android:id="@+id/main_orders_table"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
            <TableRow
                android:id="@+id/main_orders_row"
                android:layout_width="match_parent"
                android:layout_height="match_parent">

                <include
                    android:layout_height="match_parent"
                    android:layout_width="match_parent"
                    android:layout_weight="1"
                    android:id="@+id/myid1"
                    layout="@layout/order" />

            </TableRow>

            <TableRow
                android:id="@+id/main_orders_rows"
                android:layout_width="match_parent"
                android:layout_height="match_parent">

            </TableRow>
        </TableLayout>
    </ScrollView>

它包括另一个视图,其中有应该对该行执行某些操作的按钮

还是换一种方式更干净?

    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    button = (Button) findViewById(R.id.order_X_btn);
    orderTable = (TableLayout) findViewById(R.id.main_orders_table);
    order = (TableRow) findViewById(R.id.main_orders_rows);
    //final ViewGroup orders = (ViewGroup) orderTable;
    plus = (TextView) findViewById(R.id.plus);
    plus.setOnClickListener(this);
    button.setOnClickListener(this);
    getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
    getSupportActionBar().hide();
    //orderTable.addView(order);

}
@Override
protected void onResume() {
    super.onResume();
}

@Override
public void onBackPressed() {

}

@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.order_X_btn:
            deleteOrder(v);
            break;
        case R.id.plus:
            addOrder();
            break;
    }
}

//////////////////////////////////////////////////////////////////////////////////////////////////

private void addOrder() {
    last++;
    final View extend = LayoutInflater.from(this).inflate(R.layout.order,null);
    extend.setTag(orderTable.getChildAt(last));
    button.setTag(extend);
    button.setOnClickListener(this);
    //deleteButton.setOnClickListener(new View.OnClickListener);
    orderTable.addView(extend);

}

private void deleteOrder(View v) {
    last--;
    //final View extend = LayoutInflater.from(this).inflate(R.layout.order,null);
    orderTable.removeView(v);

}

注意:下面的代码未经测试,只是给你一个提示。 假设您有某种加号按钮来添加新行,并且每一行都有自己的删除按钮。

关于创建方法:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    //no idea what is order_X_btn, but I assume that's delete row button
    // if so then you don't need it here 
    //button = (Button) findViewById(R.id.order_X_btn);
    orderTable = (TableLayout) findViewById(R.id.main_orders_table);
    order = (TableRow) findViewById(R.id.main_orders_rows);
    //final ViewGroup orders = (ViewGroup) orderTable;
    plus = (TextView) findViewById(R.id.plus);
    plus.setOnClickListener(this);
    //this is not needed here either
    //button.setOnClickListener(this);
    getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
    getSupportActionBar().hide();
    //orderTable.addView(order);

}

然后点击:

@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.plus:
            addOrder();
            break;
    }
}

添加订单:

private void addOrder() {
    last++;
    final View extend = LayoutInflater.from(this).inflate(R.layout.order,null);
    extend.setTag(orderTable.getChildAt(last));
    Button deleteButton = (Button) extend.findViewById(R.id.order_X_btn);
    deleteButton.setTag(extend);
    // set anonymous on click listener which triggers deleteOrder method
    deleteButton.setOnClickListener(v -> deleteOrder(v));
    orderTable.addView(extend);

}

删除订单:

private void deleteOrder(View v) {
    last--;
    
    orderTable.removeView((View) v.getTag());

}

由于我没有 IDE atm,可能会有一些错误,但我希望你明白了。