首页 > 解决方案 > 对多个按钮使用一个 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:

标签: javaandroid

解决方案


鉴于您发布的代码,您有几个选择。您正在分配 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
}

推荐阅读