Android - Создание нескольких onClickListeners в цикле for (Kotlin) - PullRequest
0 голосов
/ 18 сентября 2018

Я пытаюсь создать большое количество (~ 600) слушателей по щелчку для большой сетки кнопок.Я создал функцию, которая хранит идентификаторы каждого квадрата в списке с именем squareList, в котором каждому квадрату присваивается строковое значение id (sq000, sq001, sq002)

Я хотел бы создать дляцикл, который извлекает идентификатор каждого квадрата, а затем создает onClicklistener, вроде как:

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

Другой способ, которым я думал о реализации этого, - написать одну функцию onClick и прикрепить ее к каждой кнопке вXML-файл, но я не совсем уверен, что это возможно, так как я новичок в Kotlin / Java

Ответы [ 6 ]

0 голосов
/ 18 сентября 2018

Одним из прямых методов достижения этой цели будет создание одной функции, которая будет вызываться при событии нажатия для всех кнопок, и внутри функции вы можете идентифицировать нажатую кнопку, получив ее идентификатор и используя оператор 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")
       }
   }

, когда заменяет оператор переключения языка Java.

0 голосов
/ 18 сентября 2018

почему бы просто не включить прослушиватель on item во всей компоновке сетки, а затем включить прослушиватель внутри этого типа, например

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

, чтобы вам не понадобилось иметь идентификаторы всего внутриВ этом случае вы можете просто поменять место, где вы собираетесь, на основе позиции: Int щелкнул внутри сетки, или я не понимаю, что вы пытаетесь сделать?

0 голосов
/ 18 сентября 2018

Если каждый button должен иметь одинаковые функциональные возможности в setOnClickListener, то это то, что вы можете сделать.

listOf(listOfSquares).forEach {
            it?.setOnClickListener {
               // Do something
        }
}
0 голосов
/ 18 сентября 2018

Вам не нужен новый ClickListener объект для каждой кнопки.Просто сделайте экземпляр слушателя ОДНОГО щелчка (пусть ваша деятельность реализует его, или создайте для него новый класс, или используйте анонимный класс).Вы можете передать этот экземпляр в метод setOnClickListener вашей кнопки.Вы можете определить, какая кнопка была нажата, используя метод view.getId() и сравнив ее с идентификаторами своих кнопок.

0 голосов
/ 18 сентября 2018

Я не уверен, правильно ли я понял, но вы можете попытаться инкапсулировать идентификатор и слушателя в 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>.

0 голосов
/ 18 сентября 2018

Вы можете прослушать. Нажмите на свою деятельность.

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

Если вы планируете изменить какое-либо поведение в соответствии с идентификаторами, вам не нужен случай здесь.Расширьте класс Button как GridButton и убедитесь, что тип класса GridButton равен

if (obj is C)
{
  //your code
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...