如果活动是用Kotlin编写的,则Button onClick属性为none

如果活动是用Kotlin编写的,则Button onClick属性为none,kotlin,android-studio-3.0,Kotlin,Android Studio 3.0,遵循本教程:如果我使用MainActivity.java按钮OnClick属性具有sendMessage()方法 但是,如果我使MainActivity.kt按钮OnClick属性没有任何显示,只有一个none 这是Android Studio 3的bug还是我错过了Kotlin的一些东西 Java Main活动: public class MainActivity extends AppCompatActivity { @Override protected void onC

遵循本教程:如果我使用
MainActivity.java
按钮
OnClick
属性具有
sendMessage()
方法

但是,如果我使
MainActivity.kt
按钮
OnClick
属性没有任何显示,只有一个
none

这是Android Studio 3的bug还是我错过了Kotlin的一些东西

Java Main活动:

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
    }
}
科特林主要活动:

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本身中轻松定义这一点。但是使用android:onClick属性仍然有点昂贵

<>你可以考虑使用和综合性质:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    button.setOnClickListener {
        // Do something in response to button
    }
}

设计师似乎还不支持Kotlin。以下是一些解决方案:

XML(不推荐)

将以下行添加到
按钮
标记中。这正是设计师要做的

android:onClick="sendMessage"
旧时尚

不需要添加任何内容

val button = findViewById<Button>(R.id.Button)
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)
}
override-fun-onCreate(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val按钮=findViewById(R.id.button)
button.setOnClickListener{
sendMessage()
}
}
/**当用户点击发送按钮时调用*/
私人娱乐发送消息(){
val editText=findviewbyd(R.id.editText)
val message=editText.text.toString()
val intent=intent(这是DisplayMessageActivity::class.java)
{
putExtra(额外消息,消息)
}
星触觉(意图)
}

您的代码如下所示:

button.setOnClickListener(){
            Toast.makeText(this@MainActivity, "Its toast!", Toast.LENGTH_SHORT).show();
        }
此处导入将

import kotlinx.android.synthetic.main. activity_main.*

这里的“button”是.xml文件中该按钮的id。这里的优点是不需要在java类中创建Button对象

一旦将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函数中:


然后它就成功了。

点击按钮实现它可以在Android中通过某些方式完成

以下是一些可能的方法示例:

1> 使用OnClickListener作为接口 这里我们使用OnClicklistener实现我们的主要活动 并重写函数onClick

override fun onClick(v: View?) {
        when (v?.id){
            (R.id.btn1) -> {
                toastmsg("Button1");
            }

            R.id.btn2 -> {
                toastmsg("Button2");
            }
        }
    }
2> 并创建一个函数,并将 可变样本:

        findViewById<Button>(R.id.btn3).setOnClickListener(btnClick);

var btnClick =
        OnClickListener {
            Toast.makeText(this, "BtnClick", Toast.LENGTH_SHORT).show() ;
        }
示例的完整示例代码它包含按钮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();
    }
}
class MainActivity:AppCompatActivity(),OnClickListener{
lateinit var tv1:TextView;
lateinit var tv2:TextView;
lateinit var tv3:TextView;
变量btn1:按钮?=null;
变量btn2:按钮?=null;
变量btn3:按钮?=空;
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
btn1=findViewById(R.id.btn1);
btn1?.setOnClickListener{
演讲会(“测试按钮1”);
}
findviewbyd(R.id.btn2).setOnClickListener(this);
findViewById(R.id.btn3).setOnClickListener(btnClick);
}
var btnClick=
onclick侦听器{
Toast.makeText(这是“BtnClick”,Toast.LENGTH_SHORT).show();
}
覆盖有趣的onClick(v:视图?){
何时(v?.id){
(R.id.btn1)->{
演讲会(“按钮1”);
}
R.id.btn2->{
演讲会(“按钮2”);
}
}
}
私人趣味演讲会(msg:String){
Toast.makeText(这个“DaggerTest”+msg,Toast.LENGTH_SHORT).show();
}
}

您可以用XML发布布局文件吗?但我不建议您在布局文件上设置
onClick
,因为您将编程逻辑放在视图文件上。使用kotlin android扩展,您可以通过id访问视图,在布局中设置视图没有意义。@Joshua,布局添加。我知道这种方法。我很好奇为什么在Kotlin中该属性不能访问活动方法。在这里我想知道@Vahid,你怎么会注意到这一点。我假设
类路径
设置不正确。现在你也让我好奇了。@Joshua说它应该是相对于Android Studio designer的。我在build.gradle的最底部添加了“apply plugin:“kotlin Android extensions”。但是在哪里添加“/”按钮是按钮id button.setOnClickListener{}部分呢?如果你问我的话,《入门手册》中有一个错误。好吧,我是通过XML(android:onClick=“sendMessage”)完成的,这很有效。但为什么不建议这样做呢?@Freek在我看来,XML应该只关注如何查看is布局。编程逻辑应该在代码中。当其他人读取您的代码时,他们将不知道侦听器是以XML形式添加的。此外,在重用XML时,必须确保函数必须存在于两个活动中。与其他方法相比,用XML编写侦听器没有任何好处。因此,不推荐使用。这里推荐的是不推荐的。这是一种更自然的Kotlin方式,而且不必获取按钮对象是很酷的“导入kotlinx.android.synthetic.main.activity_main.*”-笔划有错误,“导入kotlinx.android.synthetic.main.activity_main.*”-没有错误
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();
    }
}