有没有一种方法可以将多个 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 个 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 个变量。每个变量都有几个文本视图和一个 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
可能是你可以使用 HashMap
,key 是 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){
...
}
我得到了 8 个 ImageViews
的多个 OnClickListener
,背后的逻辑相同。 OnClick Variable-Details
将显示。我试图将它们总结在一个方法中,并尝试将它们添加到带有循环的 OnCreate
方法中。但它没有用。现在我有 8 个听众,还有 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 个变量。每个变量都有几个文本视图和一个 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()
:
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
可能是你可以使用 HashMap
,key 是 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){
...
}