Java 在AndroidStudio中是否有方法将多个OnClickListener汇总为一个函数?

Java 在AndroidStudio中是否有方法将多个OnClickListener汇总为一个函数?,java,android-studio,onclicklistener,Java,Android Studio,Onclicklistener,我得到了8个imageview的多个OnClickListener,后面有相同的逻辑单击变量详细信息将显示。我试图用一个方法总结它们,并试图用一个循环将它们添加到OnCreate方法中。但它没有起作用。现在我有8个监听器,在onCreateMethod上还有8个addListener 还有更优雅的方式吗 private void addListenerCal1Arrow() { ivCalArrow1.setOnClickListener(new View.OnClickLis

我得到了8个
imageview
的多个
OnClickListener
,后面有相同的逻辑<代码>单击变量详细信息将显示。我试图用一个方法总结它们,并试图用一个循环将它们添加到
OnCreate
方法中。但它没有起作用。现在我有8个监听器,在
onCreateMethod
上还有8个
addListener

还有更优雅的方式吗

 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时,应显示信息。我得到了一个容器类,它包含了变量的所有小部件,比如TextView和imageview,还有当它被点击时显示的描述。有两个级别来汇总代码

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

1.实现
OnClickListener
而不使用
匿名内部类
使您的活动或片段
实现OnClickListener
并重写
onClick()

将此
用作方法
setOnClickListener()的OnClickLister

b。识别点击源(哪个ImageView生成了操作) 您需要将视图id与8个ImageViews 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()
general以正确处理单击:这涉及使用数组而不是使用以1 2 3命名的单个变量,如
cal1Clicked
cal2Clicked
。。。或TVScription1、TVScription2

这可以通过多种方式完成,理解或维护起来可能会很复杂,因此请尽量把它弄清楚

您可能需要一个映射,其中
ImageView.getId
作为键,并根据需要提供一些值

比如说,, 布尔变量
calXClicked
可能是您可以使用
HashMap
键是calX的标识符,值是
boolean
,用于单击状态 据我所知,
cal1Clicked
的标识符是图像视图本身
ivCalArrow1
,因此:

声明这个类的作用域

HashMap<int, boolean> calClickedStatus = new HashMap();
现在,在onClick()中,您将使用view.getId作为键来查找所需的其他数据 无需查找单击的来源,因为您将使用键(view.getId)查找它

正如我前面提到的,这可能很复杂,可能很难解释
这可以通过多种方式完成,因此这只是在概念上为您提供指导,其余部分由您决定

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

android:onClick="myClickFct" 
android:clickable="true"
在加载布局的类中,方法:

public void myClickFct(View view){

       ...

}

请向我们展示您的代码。
汇总到哪个级别?对8个图像使用1
onClick()
方法?重构逻辑的实现,使其适用于所有8个图像?我们需要查看代码,如果它们都是相同的——正如您所说的——发布一个onClick()方法的内容,并简要说明它是什么does@J对不起,我解释得不好。这是我的第一个问题。。我添加了第一个onclick侦听器的代码。为了更好地理解:我得到了一个实验片段,在这里我最多可以添加8个变量。每个变量都有几个TextView和一个ImageView,其中包含关于变量的更多信息。单击ImageView时,应显示信息。我得到了一个容器类,它包含了一个变量的所有小部件,比如TextView和imageview,还有当单击时显示的描述谢谢你的详细回答。我想我明白了你的想法。我已经拿到你说的地图了,我只是忘了提它。我会让你知道我是否能成功地实现这一点。谢谢!我最深切的感谢,你给了我150行代码。它与您的方法配合得很好。您刚才提到的Hashmap已经以Map的形式存在于我的代码中,它包含了一个变量(实验变量)(layout、TextView、edittext、imageview)的所有小部件。也许你能帮我做另一件我想改变的事。就目前情况而言,我分别为每个试验变量声明了所有小部件。所以我得到了8*6小部件。是否有一种方法可以在每次添加新变量时声明一个示例并自动创建一个新对象?`很高兴听到这个消息,我不太确定我是否了解您需要什么,但是相同的重复布局(文本视图、按钮等)这主要可以使用带有自定义适配器的
列表视图来实现
,谷歌一下,看看它是否对你有用,同时,如果它满足了你的问题,接受这个答案是很好的:)对不起,我花了这么长时间才接受你的答案!我在谷歌上搜索了自定义适配器列表视图,但它可能不足以解决我的问题。我可以大胆地向你解释一下吗?就目前情况而言,我得到了8个布局,每个布局包含一个复选框、2个文本视图、1个编辑文本、1个图像视图)。每个布局都代表一个“变量”,当用户单击“添加按钮”时会添加该变量,小部件中会填充有关所选变量的信息。我的问题是,我需要声明所有8个布局及其6个小部件。有没有办法创建一个模式并使用它?listview和适配器看起来不错,用属性为“Variable”创建类:text1、text2、image…等等,当用户单击添加该类的创建对象,并将其添加到适配器时,它将出现在列表上,您就完成了…lonescu:哦,我的糟糕。但也要感谢您提出的解决问题的想法:)
//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
@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"
public void myClickFct(View view){

       ...

}