【问题标题】:Android - Creating Multiple onClickListeners in a for loop (Kotlin)Android - 在 for 循环中创建多个 onClickListeners (Kotlin)
【发布时间】:2019-02-22 17:55:51
【问题描述】:

我正在尝试为大量按钮实例化大量(约 600 个)onclick 侦听器。我创建了一个函数,将每个正方形的 id 存储在一个名为 squareList 的列表中,其中每个正方形都分配有一个字符串值 id (sq000, sq001, sq002)

我想创建一个 for 循环来提取每个正方形的 id,然后创建一个 onClicklistener,有点像:

fun createSquareListeners(listOfSquares: MutableList<String>)
{
    for(square in listOfSquares)
    {
       square.setOnClickListener{ //Do Something}
    }
}

我想到的另一种实现方式是编写一个 onClick 函数,并将其附加到 xml 文件中的每个按钮,但我不太确定有什么可能,因为我对 Kotlin/Java 还很陌生

【问题讨论】:

    标签: android kotlin


    【解决方案1】:

    您可以在点击您的活动时收听

    class MyActivity:Activity(), OnClickListener {
      fun onClick(v:View) {
        R.id.Button1
        run({
          //...
          break })
        R.id.Button2
        run({
          //..
          break })
      }
    }
    

    如果您打算根据 ID 更改某些行为,则此处不需要此案例。将Button类扩展为GridButton,并确保类类型为GridButton by

    if (obj is C)
    {
      //your code
    }
    

    【讨论】:

    • 我认为这根本不是一个可行的实现。要添加的点击监听器的数量是巨大的。您是否打算为约 600 个网格项编写手册 when 语句?
    • 只有一个监听器,即顶层的活动。你能告诉每个按钮做什么吗?添加这么多按钮会很慢。
    • 很久以前,我使用这种技术与一个私有成员每个扩展按钮正常工作。
    • 我同意。您的实现使得无需应用大量点击侦听器,只需一个侦听器就足够了。但是,您必须在 when 语句中应用“n”个案例。在这种特殊情况下,~600。不是一个好的实现。但是,如果可以点击的对象数量有限,我相信这还不错。至于你想添加这么多按钮很慢,是的,我同意。使用网格布局会更好。
    • 重载按钮类,以便让我们完成他们的工作,这消除了我所说的 when 情况。那就是面向对象,对吧。
    【解决方案2】:

    我不确定我是否理解正确,但您可以尝试将 id 和侦听器封装在 Square 对象中。

    类似这样的:

    class Square(context: Context?, id: String) : Button(context) {
    
        override fun setOnClickListener(l: OnClickListener?) {
            super.setOnClickListener(l)
            //TODO: use your id to something
        }
    }
    

    您必须将您的 listOfSquares 更改为 MutableList&lt;Square&gt;

    【讨论】:

      【解决方案3】:

      您不需要为每个按钮创建一个新的ClickListener 对象。只需创建一个单击侦听器实例(让您的活动实现它或为其创建一个新类或使用匿名类)。您可以将该实例传递给按钮的setOnClickListener 方法。您可以通过使用view.getId() 方法并将其与您的按钮ID 进行比较来判断单击了哪个按钮。

      【讨论】:

      • 这听起来可能对我有用,但我在这方面太陌生了,我必须做一些研究。我主要在微控制器的 C/C++/C# 编程方面经验丰富,所以我只是掌握了 Java/Kotlin 语法和流程。我会报告并告诉你进展如何,谢谢!
      【解决方案4】:

      如果每个button 需要在其setOnClickListener 中具有相同的功能,那么您可以这样做。

      listOf(listOfSquares).forEach {
                  it?.setOnClickListener {
                     // Do something
              }
      }
      

      【讨论】:

        【解决方案5】:

        为什么不在整个网格布局上设置一个 on item 监听器,然后在里面设置一个监听器,比如

        gridView.setOnItemClickListener(object:OnItemClickListener() {
           fun onItemClick(parent:AdapterView<*>, v:View,
                      position:Int, id:Long) {
              // DO something
           }
        })
        

        这样您就不需要在网格视图中包含所有内容的 id,然后您可以更改您在位置上的位置:Int 在网格视图内单击,或者我不明白您要做什么?

        【讨论】:

          【解决方案6】:

          实现这一点的直接方法之一是创建一个函数,以便在所有按钮的点击事件上调用,在函数内部,您可以通过获取按钮的 id 并使用when 运算符来识别按下的按钮来执行不同的按钮点击不同的操作。

          在布局中添加 Button 像这样:-

          <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:app="http://schemas.android.com/apk/res-auto"
          xmlns:tools="http://schemas.android.com/tools"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          tools:context=".MainActivity">
          
          <Button
              android:id="@+id/button"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:text="Button"
              android:onClick="toastMe"
              tools:layout_editor_absoluteX="95dp"
              tools:layout_editor_absoluteY="216dp" />
          <Button
              android:id="@+id/button2"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:text="Button"
              android:onClick="toastMe"
              tools:layout_editor_absoluteX="95dp"
              tools:layout_editor_absoluteY="216dp" />
          
            </LinearLayout>
          

          在您的 kotlin 代码中,将您的函数如下所示:-

           fun toastMe(view : View) {
             when (view.id) {
                 R.id.button -> print("x == 1")
                 R.id.button2 -> print("x == 2")
                 else -> { // Note the block
                     print("x is neither 1 nor 2")
                 }
             }
          

          when 替换了java语言的switch操作符。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-10-23
            • 2022-01-24
            • 2014-10-19
            • 1970-01-01
            相关资源
            最近更新 更多