Синтаксис, используемый в построителе предупреждений - PullRequest
0 голосов
/ 16 января 2020

Мне трудно понять синтаксис, используемый для вызова AlertDialog.Builder. Этот фрагмент кода показан по этой ссылке: https://android--code.blogspot.com/2018/02/android-kotlin-alertdialog-example.html

Когда он звонит builder.setPositiveButton(), он использует этот код:

builder.setPositiveButton("YES") { dialog, which ->
   Toast.makeText(applicationContext, "Ok, we change the app background.", Toast.LENGTH_SHORT).show()
   root_layout.setBackgroundColor(Color.RED)
}

Мой вопрос:

1: Что означает dialog, which ->?

2: Когда я вызываю метод, что означает пропуск { something }? Будет ли он выполняться вместе со своей собственной функцией?

Спасибо.

Ответы [ 2 ]

1 голос
/ 16 января 2020

Код использует преимущества Kotlin функции преобразования SAM, которая является более чистым синтаксисом для использования интерфейсов, которые имеют только один метод (см. эту статью для хорошего объяснения). В этом случае при нажатии положительной кнопки диалога будет выполнен следующий код:

Toast.makeText(applicationContext,"Ok, we change the app background.",Toast.LENGTH_SHORT).show()
root_layout.setBackgroundColor(Color.RED)

dialog и which - это два параметра DialogInterface.OnClickListener . На них можно ссылаться в исполняемом блоке, если это необходимо.

Если записать полностью, это будет выглядеть так:

builder.setPositiveButton("YES", new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int which) {
        Toast.makeText(applicationContext,"Ok, we change the app background.",Toast.LENGTH_SHORT).show()
        root_layout.setBackgroundColor(Color.RED)
    }
});
1 голос
/ 16 января 2020

setPositiveButton принимает два параметра, первый - текст кнопки, а второй - реализацию интерфейса DialogInterface.OnClickListener.

Но когда мы видим код builder.setPositiveButton("YES"), метод принимает только один аргумент.

Так где же второй аргумент , который должен иметь тип DialogInterface.OnClickListener?

Ну и блок кода в фигурных скобках после builder.setPositiveButton("YES") равен этот второй аргумент. Поскольку этот аргумент является SAM интерфейсом и, следовательно, вы можете написать для него лямбду, kotlin позволяет вывести его из вызова функции.

из Kotlin В действии

В Kotlin соглашение syntacti c позволяет перемещать лямбда-выражение из скобок, если это последний аргумент в вызове функции. В этом примере лямбда является единственным аргументом, поэтому его можно поместить после скобок:

people.maxBy() { p: Person -> p.age }

Когда лямбда является единственным аргументом функции, вы также можете удалить пустые скобки от звонка:

people.maxBy { p: Person -> p.age }

...