java - 对多个按钮使用一个 onclicklistener(循环制作)
问题描述
我正在使用 for 循环制作多个按钮,并希望为所有这些按钮使用一个 onclicklistener。问题是,由于我在循环中制作按钮,所以不知道如何在 while 循环中区分它们(因为我没有不同的按钮 ID)。这是 MainActivity 代码
package com.example.practice_button_loop;
import androidx.appcompat.app.AppCompatActivity;
import android.annotation.SuppressLint;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.Toast;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private static final String TAG = "ZSA";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button myButton = null;
int number = 10; // number of buttons
LinearLayout layout = (LinearLayout) findViewById(R.id.buttons);
for (int i = 1; i < number; i++) {
myButton = new Button(this);
myButton.setId(i);
myButton.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT, 1f));
myButton.findViewById(R.id.buttons);
myButton.setText("Button# " + i);
layout.addView(myButton);
myButton.setOnClickListener(this);
}
}
@Override
public void onClick(View v) {
Log.d(TAG, "onClick:"+v.getId());
//System.out.println(v);
switch(v.getId()){
case R.id.buttons:
Log.d(TAG, "on:"+v.getId());
Toast.makeText(this, "Button #" +v, Toast.LENGTH_SHORT).show();
break;
}
}
}
这是我的 main.xml 文件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:clickable="true"
tools:context=".MainActivity">
<ScrollView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scrollbars="vertical">
<LinearLayout
android:id="@+id/buttons"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_marginLeft="50dp"
android:layout_marginRight="50dp"
android:orientation="vertical">
</LinearLayout>
</ScrollView>
</RelativeLayout>
这条线是我认为的主要问题:
case R.id.buttons:
解决方案
鉴于您发布的代码,您有几个选择。您正在分配 1-9 的 ID,因此您可以在侦听器中检查这些值:
switch(v.getId()){
case 1:
Log.d(TAG, "on:"+v.getId());
Toast.makeText(this, "Button #" +v, Toast.LENGTH_SHORT).show();
break;
case 2:
Log.d(TAG, "on:"+v.getId());
Toast.makeText(this, "Button #" +v, Toast.LENGTH_SHORT).show();
break;
// etc
}
但是,由于您知道 ID 是从 1 到 9 运行的,您可能甚至不想费心检查 ID:
public void onClick(View v) {
Toast.makeText(this, "Button #" +v.getId(), Toast.LENGTH_SHORT).show();
}
或者,您可以稍微不同地设置您的点击侦听器:
for (int i = 1; i < number; i++) {
myButton = new Button(this);
myButton.setId(i);
myButton.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT, 1f));
myButton.findViewById(R.id.buttons);
myButton.setText("Button# " + i);
layout.addView(myButton);
myButton.setOnClickListener((v) -> onButtonClick(myButton, i));
}
public void onButtonClick(Button button, int index) {
// here you have direct access to the index
}
推荐阅读
- python - 这个冒号是什么意思?
- c# - 使用 ObjectResult 将 EF6 转换为 EF 核心
- git - 根文件系统的git版本控制目录
- html - 弹性增长的弹性盒容器中的动态弹性项目高度
- javascript - 即使在使用 setTimeOut 之后,setState 也会立即更新
- c# - asp.net web 表单中站点地图权限中的用户权限
- python - 如何理解 Class 中的 `self.fields`?
- mysql - 删除相似记录时我的 SQL 查询出错
- angular - 在模板中使用表达式作为输入值
- android - 使用 Imagepicker 在本机 Expo 中选择多个图像