如果活动是用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();
}
}