有没有办法将多个OnClickListener汇总到AndroidStudio中的一个函数中?

时间:2016-01-21 07:51:58

标签: java android-studio onclicklistener

我为8 OnClickListener获得了多个ImageViews,后面有相同的逻辑。将显示OnClick Variable-Details。我尝试在方法中对它们进行总结,并尝试使用Loop在OnCreate方法中添加它们。但它没有用。现在我有8位听众,还有addListener位于onCreateMethod

有更优雅的方式吗?

 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个变量。每个变量都有几个textview,还有一个ImageView,它包含有关变量的更多信息。单击ImageView时,它将显示信息。我有一个容器类,包含变量的所有小部件,如textviews和imageview,以及单击时显示的描述

2 个答案:

答案 0 :(得分:1)

有两个级别来汇总这段代码

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

1.a实施 OnClickListener而不使用anonymous inner class 制作您的活动或片段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 ...

<强>湾识别点击源(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- make onClick() general来正确处理点击:这涉及使用数组而不是以1 2 3命名的单个变量,如cal1Clicked cal2Clicked ...或tvDescription1,tvDescription2 ...

这可以通过多种方式完成,理解或维护可能很复杂,因此请尽量明确

您可能需要一张地图,其中ImageView.getId为关键,而某些值则根据您的需要

例如,

布尔变量calXClicked可以使用HashMap是calX的标识符,boolean对于点击状态 根据我的理解,cal1Clicked的标识符是imageView本身ivCalArrow1所以:

声明此类范围

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

at 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);
    }
}
如前所述,这可能很复杂,可能很难解释 它可以通过各种方式完成,所以这只是为了指导你的概念,其余的由你决定

答案 1 :(得分:1)

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

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

以及在加载布局方法的类中:

public void myClickFct(View view){

       ...

}