有没有一种方法可以将多个 OnClickListener 汇总为 Android Studio 中的一个函数?

Is there a way to summarize multiple OnClickListener into one function in AndroidStudio?

我得到了 8 个 ImageViews 的多个 OnClickListener,背后的逻辑相同。 OnClick Variable-Details 将显示。我试图将它们总结在一个方法中,并尝试将它们添加到带有循环的 OnCreate 方法中。但它没有用。现在我有 8 个听众,还有 8 个 addListeneronCreateMethod

有没有更优雅的方式?

 private void addListenerCal1Arrow() {
        ivCalArrow1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (!cal1Clicked) {
                    cal1Clicked = true;
                    ivCalArrow1.setImageResource(R.drawable.arrow_symbol_up);
                    tvDescription1.setVisibility(View.VISIBLE);
                } else {
                    cal1Clicked = false;
                    ivCalArrow1.setImageResource(R.drawable.arrow_symbol_down);
                    tvDescription1.setVisibility(View.GONE);
                }
            }
        });
    }

更多说明: 我有一个实验片段,我可以在其中最多添加 8 个变量。每个变量都有几个文本视图和一个 ImageView,其中包含有关该变量的更多信息。单击 ImageView 时,它应显示信息。我有一个容器 class 包含一个变量的所有小部件,如文本视图和图像视图以及单击时应显示的描述

有 2 个级别来总结这段代码

1- 对所有 ImageView 使用 1 个 onClick():这涉及

1.a 实施 OnClickListener 而不使用 anonymous inner class 制作你的 activity 或片段 implements OnClickListener 并覆盖 onClick()

public class MyActivity extends Activity implements OnClickListener {
    //class implementation


    @override
    public void onClick(View view){
    }
}

使用 this 作为方法 setOnClickListener():

的 OnClickLister
ivCalArrow1.setOnClickListener(this);//this here refers to MyActivity
ivCalArrow2.setOnClickListener(this);//this here refers to MyActivity
//and so on ...

b. recognize 点击源(哪个 ImageView)生成了动作) 您需要将视图 ID 与 8 个 ImageViews ID 进行比较,并根据该 ID 执行正确的代码:

@override
public void onClick(View view){
    if(view.getId() == ivCalArrow1.getId()){
        //do what needed on ivCalArrow1
    }else if(view.getId() == ivCalArrow2.getId()){
        //do what needed on ivCalArrow2
    }
    //and so on ... for 3 4 5 6 7 8
}

2- 使 onClick() 通用以正确处理点击:这涉及使用数组而不是使用 1 2 3 命名的单个变量,例如 cal1Clicked cal2Clicked ... 或 tvDescription1 , tvDescription2 ...

这可以通过多种方式完成,理解或维护起来可能很复杂,所以尽量说清楚

您可能需要一个地图,其中 ImageView.getId 作为键和一些基于您需要的值

例如, 布尔变量 calXClicked 可能是你可以使用 HashMapkey 是 calX 的标识符,value点击状态为boolean 根据我的理解,cal1Clicked 的标识符是 imageView 本身 ​​ivCalArrow1 所以:

声明此 class-scope

HashMap<int, boolean> calClickedStatus = new HashMap();

onCreate() 添加这个:

//assuming all boolean values are false on first create of activity
calClickedStatus.put(ivCalArrow1.getId,false);
calClickedStatus.put(ivCalArrow2.getId,false);
calClickedStatus.put(ivCalArrow3.getId,false); // and so on

现在在 onClick() 中,您将使用 view.getId 作为查找所需其他数据的键 无需查找点击的来源,因为您将使用键 (view.getId)

进行查找
@override
public void onClick(View view){
    if (!calClickedStatus.get(view.getId())) {
        calClickedStatus.put(view.getId(), true);

        //the view here is actually the clicked ImageView, so just cast it and use it, replace this
        //ivCalArrow1.setImageResource(R.drawable.arrow_symbol_up);
        //with this
        ((ImageView)view).setImageResource(R.drawable.arrow_symbol_up);

        //now for this, you may want to use an array of TextView to hold tvDescription1, tvDescription2 ...
        //and make a map to link each tvDescriptionX to the index of licked image
        tvDescription1.setVisibility(View.VISIBLE);
    } else {
        //do same changes here too
        calClickedStatus.put(view.getId(), false);
        ivCalArrow1.setImageResource(R.drawable.arrow_symbol_down);
        tvDescription1.setVisibility(View.GONE);
    }
}

正如我之前提到的,这可能很复杂并且可能难以解释 它可以通过多种方式完成,所以这只是为了指导您了解这个概念,其余的由您决定

您可以在布局中为每个视图定义以下内容:

android:onClick="myClickFct" 
android:clickable="true"

并且在加载布局的 class 方法中:

public void myClickFct(View view){

       ...

}