按钮 onClick 属性是 none 如果 activity 用 Kotlin 写
Button onClick attribute is none if activity written in Kotlin
按照本教程进行操作:Android - Start Another Activity 如果我制作了 MainActivity.java
按钮 OnClick
属性具有 sendMessage()
方法。
但是如果我制作MainActivity.kt
按钮OnClick
属性没有什么可显示的,只是一个none
.
这是 Android Studio 3 错误还是我遗漏了 Kotlin 的某些内容?
Java 主要活动:
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
}
}
科特林主要活动:
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
}
}
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>
您可以在 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
}
}
看来设计者还不支持Kotlin。这里有一些解决方案:
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 {
}
这是我在 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)
}
您的代码会像这样:
button.setOnClickListener(){
Toast.makeText(this@MainActivity, "Its toast!", Toast.LENGTH_SHORT).show();
}
这里导入会:
import kotlinx.android.synthetic.main. activity_main.*
此处 "button" 是 .xml 文件中该按钮的 ID。这里的优点是不需要在 java class 中创建 Button 对象。
一旦将 sendMessage class 定义为:
/** Called when the user taps the Send button */
fun sendMessage(view: View) {
setContentView(R.layout.activity_second)
// Do something in response to button
}
并且还定义了第二个 activity 为:
class SecondActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_second)
}
}
我将 SendMessage 添加到 OnClick 函数中:
然后成功了。
按钮 OnClick 实现它可以通过 Android
中的一些方法来完成
一些可能的方法如下示例:
1>使用 OnClickListener 作为接口
这里我们用 OnClicklistener 实现我们的主要 activity
并覆盖函数 onClick
override fun onClick(v: View?) {
when (v?.id){
(R.id.btn1) -> {
toastmsg("Button1");
}
R.id.btn2 -> {
toastmsg("Button2");
}
}
}
2>并创建一个函数并将 OnClickListener 传递给
变量样本:
findViewById<Button>(R.id.btn3).setOnClickListener(btnClick);
var btnClick =
OnClickListener {
Toast.makeText(this, "BtnClick", Toast.LENGTH_SHORT).show() ;
}
3>在 Oncreate() 中创建 OnClickListener
btn1=findViewById(R.id.btn1);
btn1?.setOnClickListener {
toastmsg("test button1");
}
示例的完整示例代码,它包含 Button OnClickListener 的所有可能实现:
class MainActivity : AppCompatActivity() , OnClickListener{
lateinit var tv1:TextView;
lateinit var tv2:TextView;
lateinit var tv3:TextView;
var btn1: Button? =null;
var btn2: Button? =null;
var btn3: Button? =null;
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
btn1=findViewById(R.id.btn1);
btn1?.setOnClickListener {
toastmsg("test button1");
}
findViewById<Button>(R.id.btn2).setOnClickListener(this);
findViewById<Button>(R.id.btn3).setOnClickListener(btnClick);
}
var btnClick =
OnClickListener {
Toast.makeText(this, "BtnClick", Toast.LENGTH_SHORT).show() ;
}
override fun onClick(v: View?) {
when (v?.id){
(R.id.btn1) -> {
toastmsg("Button1");
}
R.id.btn2 -> {
toastmsg("Button2");
}
}
}
private fun toastmsg(msg: String){
Toast.makeText(this, "DaggerTest" + msg, Toast.LENGTH_SHORT).show();
}
}
按照本教程进行操作:Android - Start Another Activity 如果我制作了 MainActivity.java
按钮 OnClick
属性具有 sendMessage()
方法。
但是如果我制作MainActivity.kt
按钮OnClick
属性没有什么可显示的,只是一个none
.
这是 Android Studio 3 错误还是我遗漏了 Kotlin 的某些内容?
Java 主要活动:
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
}
}
科特林主要活动:
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
}
}
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>
您可以在 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
}
}
看来设计者还不支持Kotlin。这里有一些解决方案:
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 {
}
这是我在 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)
}
您的代码会像这样:
button.setOnClickListener(){
Toast.makeText(this@MainActivity, "Its toast!", Toast.LENGTH_SHORT).show();
}
这里导入会:
import kotlinx.android.synthetic.main. activity_main.*
此处 "button" 是 .xml 文件中该按钮的 ID。这里的优点是不需要在 java class 中创建 Button 对象。
一旦将 sendMessage class 定义为:
/** Called when the user taps the Send button */
fun sendMessage(view: View) {
setContentView(R.layout.activity_second)
// Do something in response to button
}
并且还定义了第二个 activity 为:
class SecondActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_second)
}
}
我将 SendMessage 添加到 OnClick 函数中:
然后成功了。
按钮 OnClick 实现它可以通过 Android
中的一些方法来完成一些可能的方法如下示例:
1>使用 OnClickListener 作为接口 这里我们用 OnClicklistener 实现我们的主要 activity 并覆盖函数 onClick
override fun onClick(v: View?) {
when (v?.id){
(R.id.btn1) -> {
toastmsg("Button1");
}
R.id.btn2 -> {
toastmsg("Button2");
}
}
}
2>并创建一个函数并将 OnClickListener 传递给 变量样本:
findViewById<Button>(R.id.btn3).setOnClickListener(btnClick);
var btnClick =
OnClickListener {
Toast.makeText(this, "BtnClick", Toast.LENGTH_SHORT).show() ;
}
3>在 Oncreate() 中创建 OnClickListener
btn1=findViewById(R.id.btn1);
btn1?.setOnClickListener {
toastmsg("test button1");
}
示例的完整示例代码,它包含 Button OnClickListener 的所有可能实现:
class MainActivity : AppCompatActivity() , OnClickListener{
lateinit var tv1:TextView;
lateinit var tv2:TextView;
lateinit var tv3:TextView;
var btn1: Button? =null;
var btn2: Button? =null;
var btn3: Button? =null;
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
btn1=findViewById(R.id.btn1);
btn1?.setOnClickListener {
toastmsg("test button1");
}
findViewById<Button>(R.id.btn2).setOnClickListener(this);
findViewById<Button>(R.id.btn3).setOnClickListener(btnClick);
}
var btnClick =
OnClickListener {
Toast.makeText(this, "BtnClick", Toast.LENGTH_SHORT).show() ;
}
override fun onClick(v: View?) {
when (v?.id){
(R.id.btn1) -> {
toastmsg("Button1");
}
R.id.btn2 -> {
toastmsg("Button2");
}
}
}
private fun toastmsg(msg: String){
Toast.makeText(this, "DaggerTest" + msg, Toast.LENGTH_SHORT).show();
}
}