如何为许多以编程方式添加的视图设置 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,可能会有一些错误,但我希望你明白了。
我有 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,可能会有一些错误,但我希望你明白了。