我为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,以及单击时显示的描述
答案 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){
...
}