如何将相同的 OnClickListener 设置为所有(多个)ImageView

How to set the same OnClickListener to all(multiple) ImageView(s)

我正在制作某种益智游戏,其中会有很多由 ImageView 组成的块。现在在这种情况下,我只有 setOnClickListener 到 imageView1,而不是我为每个 ImageView 编写相同的 setOnClickListener 块,我如何为所有 ImageView 编写一次 setOnclickListener ??

这是示例代码

MainActivity.java

public class MainActivity extends Activity {

    ImageView imageView1, imageView2, imageView3;
    int x, y;

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

        x = 0;
        y = 0;

        imageView1 = (ImageView) findViewById(R.id.image1);
        imageView2 = (ImageView) findViewById(R.id.image2);
        imageView3 = (ImageView) findViewById(R.id.image3);

        imageView1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                TranslateAnimation animation = new TranslateAnimation(0, 0, 0, 50);
                animation.setDuration(1000);
                animation.setFillAfter(false);
                animation.setAnimationListener(new MyAnimationListener());

                imageView1.startAnimation(animation);
                x += 0;
                y += 50;

            }
        });
    }

    private class MyAnimationListener implements Animation.AnimationListener {

        @Override
        public void onAnimationStart(Animation animation) {

        }

        @Override
        public void onAnimationEnd(Animation animation) {
            imageView1.clearAnimation();
            RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(imageView1.getWidth(),
                imageView1.getHeight());
            lp.setMargins(x, y, 0, 0);
            imageView1.setLayoutParams(lp);
        }

        @Override
        public void onAnimationRepeat(Animation animation) {

        }
    }
}

非常欢迎对我的代码提出所有建议和改进。提前致谢。

Create a distinct listener:

View.OnclickListener listener = new View.OnClickListener() {
            @Override 
            public void onClick(View v) {
                TranslateAnimation animation = new TranslateAnimation(0, 0, 0, 50);
                animation.setDuration(1000);
                animation.setFillAfter(false);
                animation.setAnimationListener(new MyAnimationListener());

                v.startAnimation(animation);
                x += 0;
                y += 50;

            } 
        }; 

然后将听众设置为您的观点: imageView1.setOnClickListener(listener); imageView2.setOnClickListener(listener); imageView3.setOnClickListener(listener);

让 MainActivity 实现 OnClickListener 并调用

public class MainActivity extends Activity implements OnClickListener {

    ImageView imageView1, imageView2, imageView3;
    int x, y;

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

        x = 0;
        y = 0;

        imageView1 = (ImageView) findViewById(R.id.image1);
        imageView2 = (ImageView) findViewById(R.id.image2);
        imageView3 = (ImageView) findViewById(R.id.image3);
        imageView1.setOnClickListener(this);
        imageView2.setOnClickListener(this);
        imageView3.setOnClickListener(this);

    @Override
    public void onClick(View v) {
        switch(v.getId()){
        case R.id.image1:
            TranslateAnimation animation = new TranslateAnimation(0, 0, 0, 50);
            animation.setDuration(1000);
            animation.setFillAfter(false);
            animation.setAnimationListener(new MyAnimationListener());

            imageView1.startAnimation(animation);
            x += 0;
            y += 50;
        break;
        case R.id.image2:
        break;
        case R.id.image3:
        break;
        }
    }
}

您可以使用如下所示的 Activity 实现您的自定义 OnClickListener,

public class MainActivity extends Activity implements View.OnClickListener{

    ImageView imageView1, imageView2, imageView3;
    int x, y;

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

        x = 0;
        y = 0;

        imageView1 = (ImageView) findViewById(R.id.image1);
        imageView2 = (ImageView) findViewById(R.id.image2);
        imageView3 = (ImageView) findViewById(R.id.image3);

        imageView1.setOnClickListener(this);
        imageView2.setOnClickListener(this);
        imageView3.setOnClickListener(this);
    }
@Override
public void onClick(View v) {
   TranslateAnimation animation = new TranslateAnimation(0, 0, 0, 50);
                animation.setDuration(1000);
                animation.setFillAfter(false);
                animation.setAnimationListener(new MyAnimationListener(v));

                v.startAnimation(animation);
                x += 0;
                y += 50;
}
    private class MyAnimationListener implements Animation.AnimationListener {
        private View mView;

        public MyAnimationListener(View v)
       {
           this.mView = v;
       }
        @Override
        public void onAnimationStart(Animation animation) {

        }

        @Override
        public void onAnimationEnd(Animation animation) {
            mView.clearAnimation();
            RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(mView.getWidth(),
                mView.getHeight());
            lp.setMargins(x, y, 0, 0);
            mView.setLayoutParams(lp);
        }

        @Override
        public void onAnimationRepeat(Animation animation) {

        }
    }
}

您可以尝试在变量中创建侦听器,然后将其分配给每个 ImageView。像这样:

imageView1 = (ImageView) findViewById(R.id.image1);
        imageView2 = (ImageView) findViewById(R.id.image2);
        imageView3 = (ImageView) findViewById(R.id.image3);

        View.OnClickListener listener= new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                TranslateAnimation animation = new TranslateAnimation(0, 0, 0, 50);
                animation.setDuration(1000);
                animation.setFillAfter(false);
                animation.setAnimationListener(new MyAnimationListener());

                if(v==imageView1)
                imageView1.startAnimation(animation);
                else  if(v==imageView2)
                    imageView2.startAnimation(animation);
                else  if(v==imageView3)
                    imageView3.startAnimation(animation);
                x += 0;
                y += 50;

            }
        };

        imageView1.setOnClickListener(listener);
        imageView2.setOnClickListener(listener);
        imageView3.setOnClickListener(listener);

尝试使用这个:

imageView1 = (ImageView) findViewById(R.id.image1);
        imageView2 = (ImageView) findViewById(R.id.image2);
        imageView3 = (ImageView) findViewById(R.id.image3);

        View.OnClickListener listener= new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                TranslateAnimation animation = new TranslateAnimation(0, 0, 0, 50);
                animation.setDuration(1000);
                animation.setFillAfter(false);

                ImageView vista=(ImageView) v;
                animation.setAnimationListener(new MyAnimationListener(vista));


                vista.startAnimation(animation);

                x += 0;
                y += 50;

            }
        };

        imageView1.setOnClickListener(listener);
        imageView2.setOnClickListener(listener);
        imageView3.setOnClickListener(listener);

        private class MyAnimationListener implements Animation.AnimationListener {

            ImageView selected;
            public MyAnimationListener(ImageView vista)
            {
                selected=vista;
            }

            @Override
            public void onAnimationStart(Animation animation) {

            }

            @Override
            public void onAnimationEnd(Animation animation) {
                selected.clearAnimation();
                RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(selected.getWidth(),
                        selected.getHeight());
                lp.setMargins(x, y, 0, 0);
                selected.setLayoutParams(lp);
            }

            @Override
            public void onAnimationRepeat(Animation animation) {

            }
        }

您始终可以将 class 扩展为 activity 并实施 OnClickListener。然后您应该覆盖 OnClick 函数。它以一个视图作为参数,您可以检查它是否是您想要的视图(即您的图像视图)

例如:

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;

/**
 * Created by Rohan on 15-09-2015.
 */
public class MyActivity extends Activity implements View.OnClickListener{

    ImageView imageView1, imageView2, imageView3;
    int x, y;

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

        x = 0;
        y = 0;

        imageView1 = (ImageView) findViewById(R.id.image1);
        imageView2 = (ImageView) findViewById(R.id.image2);
        imageView3 = (ImageView) findViewById(R.id.image3);

        imageView1.setOnClickListener(this);
        imageView2.setOnClickListener(this);
        imageView3.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        if(v.getId() == R.id.image1 || v.getId() == R.id.image2 || v.getId() == R.id.image3 ){
            //Do your stuff
        }
    }
}

虽然您的代码在 Java 中,但在 kotlin 中有一个简单的方法,有人可能会觉得有用。您可以为视图列表创建一个扩展函数

扩展函数:

fun List<View>.setOnClickListener(onClickView: () -> Unit) {
    this.forEach { it.setOnClickListener { onClickView.invoke() } }
}

使用方法:

listOf(ImageView, ImageView2, ImageView3).setOnClickListener { 
    // put your action here 
}