Атрибут Button onClick не имеет значения, если активность написана в Котлине
Следуйте этому учебник: Android - Запуск другой активности, если я сделал MainActivity.java
кнопка OnClick
атрибут имеет sendMessage()
метод.
Но если бы я сделал MainActivity.kt
кнопку атрибута OnClick
показывать нечего, только none
.
Это ошибка Android Studio 3 или я что-то упустил для Kotlin?
Java mainActivity:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
/** Called when the user taps the Send button */
public void sendMessage(View view) {
// Do something in response to button
}
}
Котлин mainActivity:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
/** Called when the user taps the Send button */
fun sendMessage(view: View) {
// Do something in response to button
}
}
![OnClick attribute]()
XML-макет (Java и проект Kotlin одинаковы)
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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="ir.bigbang.vahid.myapplication.MainActivity">
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button"
tools:layout_editor_absoluteX="148dp"
tools:layout_editor_absoluteY="81dp" />
</android.support.constraint.ConstraintLayout>
Ответы
Ответ 1
Кажется, что дизайнер еще не поддерживает Котлина. Вот несколько решений:
XML (не рекомендуется)
Добавьте в свой тег Button
следующую строку. Это именно то, что сделает дизайнер.
android:onClick="sendMessage"
Старая мода
Не нужно ничего добавлять.
val button = findViewById<Button>(R.id.Button)
button.setOnClickListener {
}
kotlin-android-расширения (рекомендуется)
Добавьте apply plugin: "kotlin-android-extensions"
в свой build.gradle
// button is the Button id
button.setOnClickListener {
}
Ответ 2
Ваш код будет выглядеть так:
button.setOnClickListener(){
Toast.makeText([email protected], "Its toast!", Toast.LENGTH_SHORT).show();
}
Здесь импорт будет:
import kotlinx.android.synthetic.main. activity_main.*
Здесь "кнопка" - это идентификатор этой кнопки в XML файле. Здесь преимущество заключается в том, что нет необходимости создавать объект Button в вашем Java-классе.
Ответ 3
Однажды определил класс sendMessage как:
/** Called when the user taps the Send button */
fun sendMessage(view: View) {
setContentView(R.layout.activity_second)
// Do something in response to button
}
А также определил второй вид деятельности как:
class SecondActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_second)
}
}
Я добавил SendMessage в функцию OnClick: ![enter image description here]()
И тогда это сработало.
Ответ 4
Вы можете легко определить это внутри самого XML. Но использование атрибута android:onClick
все еще немного дорого.
Вместо этого вы можете рассмотреть возможность использования Kotlin Android Extensions и синтетических свойств:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
button.setOnClickListener {
// Do something in response to button
}
}
Ответ 5
Вот решение, которое я нашел в файле MainActivity.kt.
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val button = findViewById<Button>(R.id.button)
button.setOnClickListener {
sendMessage()
}
}
/** Called when the user taps the Send button */
private fun sendMessage() {
val editText = findViewById<EditText>(R.id.editText)
val message = editText.text.toString()
val intent = Intent(this, DisplayMessageActivity::class.java).apply
{
putExtra(EXTRA_MESSAGE, message)
}
startActivity(intent)
}