我为 8 个 ImageViews
获得了多个 OnClickListener
,其背后的逻辑相同。将显示OnClick Variable-Details
。我尝试将它们总结在一个方法中,并尝试使用循环将它们添加到 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 个变量。每个变量都有几个 TextView 和一个 ImageView,它保存有关该变量的更多信息。单击 ImageView 时,它将显示信息。我有一个容器类,其中包含变量的所有小部件,例如 TextView 和 ImageView ,以及单击时应显示的描述
最佳答案
有 2 个级别来概括此代码
1- 对所有 ImageView 使用 1 个 onClick():这涉及
1.a 实现 OnClickListener
并且不使用匿名内部类
让您的 Activity 或片段实现 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.识别点击源(哪个 ImageView)生成了操作) 您需要将 View 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()
通用以正确处理点击:这涉及使用数组而不是使用 1 2 3 命名的单个变量,例如 cal1Clicked
cal2Clicked
...或 tvDescription1、tvDescription2 ...
这可以通过多种方式完成,理解或维护可能很复杂,所以尽量说清楚
您可能需要一个 map ,其中 ImageView.getId
作为键,并根据您的需要提供一些值
例如,
boolean 变量calXClicked
可以使用HashMap
,键是calX的标识符,值为 boolean
表示点击状态
根据我的理解,cal1Clicked
的标识符是 imageView 本身 ivCalArrow1
所以:
声明这个类范围
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);
}
}
正如我之前提到的,这可能很复杂并且可能很难解释 它可以通过多种方式完成,所以这只是为了指导您了解这个概念,其余的取决于您
关于java - 有没有一种方法可以将多个 OnClickListener 汇总为 Android Studio 中的一个函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34918121/