Android-在for循环中创建多个onClickListeners(Kotlin)

时间:2018-09-18 16:26:34

标签: android kotlin

我正在尝试实例化大量(〜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的新手< / p>

6 个答案:

答案 0 :(得分:2)

为什么不只是在整个网格布局上设置一个项目监听器,然后像

那样在其内部设置一个监听器
gridView.setOnItemClickListener(object:OnItemClickListener() {
   fun onItemClick(parent:AdapterView<*>, v:View,
              position:Int, id:Long) {
      // DO something
   }
})

这样,您将不需要在网格视图中拥有所有内容的ID,那么您只需更改要基于该位置的位置即可:Int在网格视图中单击,还是我不理解您要做什么?

答案 1 :(得分:1)

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

答案 2 :(得分:0)

我不确定我是否理解正确,但是您可以尝试将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<Square>

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

实现此目的的直接方法之一是为所有按钮创建一个在单击事件时调用的函数,并且在函数内部,您可以通过获取按钮的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语言的切换运算符。

答案 5 :(得分:-2)

您可以听onClick您的活动

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

如果您打算根据ID更改某些行为,则这里不需要这种情况。将Button类扩展为GridButton,并确保该类类型为GridButton,

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