java - 有没有一种方法可以将多个 OnClickListener 汇总为 Android Studio 中的一个函数?

标签 java android-studio onclicklistener

我为 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/

相关文章:

java - Eclipse 调试器中的 Stacktrace

java - 从可运行类更新 swing JEditorPane

android - 未注释的参数覆盖@NonNull 参数

android - 因错误 :Execution failed for task ':app:processDebugResources' . > com.android.ide.common.process.ProcessException 而被阻止:无法执行 aapt

java - android.widget.RadioGroup 无法转换为 android.widget.RadioButton

java - 没有从字符串值 ('' 反序列化的字符串参数构造函数/工厂方法)

java - 如何将 xlsx 文件转换为 csv?

android - R8 将抽象类的 "protected"方法更改为 "public"而没有 -allowaccessmodification 标志

android - 如何在android中为位于 Canvas 中心的项目放置一个onclick事件?

android - android中的onclick监听器