在 Kotlin 的 Android 中分配事件处理程序之前是否必须创建 View 的副本
Is it mandatory to create a copy of View before assigning an event handler in Android in Kotlin
我正在尝试在 Kotlin 文件中的 Android
按钮上设置 OnClickListener
。与 java 文件不同,我可以在 class 级别声明按钮变量并在 onCreate
方法中对其进行初始化,并同时分配 ClickListener 为:
Button inlineButton;
@Override
public void onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) {
super.onCreate(savedInstanceState, persistentState);
inlineButton = findViewById(R.id.btn_inline);
inlineButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
new NotificationToast(MainActivity.this, "Inline Button");
}
});
}
当我尝试遵循类似的模式时,我收到以下消息的错误:
只有在使用以下代码创建按钮副本时才能设置事件处理程序:
var inlineButton : Button? = null;
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
inlineButton = findViewById(R.id.btn_inline)
val inlineButtonCopy = inlineButton;
if (inlineButtonCopy != null) {
inlineButtonCopy.setOnClickListener({
NotificationToast(this,inlineButtonCopy.text.toString()).Show();
})
}
}
我想知道是否可以在顶层只创建一个 Button 实例,在 oncreate 中对其进行初始化,然后设置事件处理程序。如果我只能创建一个实例,我可以使用该事件来更改同一按钮的 属性。这是默认行为还是我遗漏了什么。
非常感谢任何澄清。
在 kotlin 中,您不需要描述 Button。可以直接调用id,设置Listener。它比 java 更容易。只是不要混淆您的 ID
btn_inline.setOnClickListener({
NotificationToast(this,inlineButtonCopy.text.toString()).Show();
})
在 Kotlin 中,您不需要定义 XML 组件的 Id's
。
您可以在 Id's
的帮助下直接访问 已经在您的 XML 中定义。
假设您在 XML 中定义的 Button
Id 是 btn_inline
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
btn_inline.setOnClickListener({
NotificationToast(this,inlineButtonCopy.text.toString()).Show();
})
}
此外,请确保 import
部分中应包含此类内容。
import kotlinx.android.synthetic.main.activity_main.*
请在你这边检查一下。
另一种选择是使用 Late-Initialized Property:
private lateinit var inlineButton: Button
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
inlineButton = findViewById<Button>(R.id.btn_inline)
inlineButton.setOnClickListener {
NotificationToast(this,inlineButtonCopy.text.toString()).Show();
}
}
我正在尝试在 Kotlin 文件中的 Android
按钮上设置 OnClickListener
。与 java 文件不同,我可以在 class 级别声明按钮变量并在 onCreate
方法中对其进行初始化,并同时分配 ClickListener 为:
Button inlineButton;
@Override
public void onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) {
super.onCreate(savedInstanceState, persistentState);
inlineButton = findViewById(R.id.btn_inline);
inlineButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
new NotificationToast(MainActivity.this, "Inline Button");
}
});
}
当我尝试遵循类似的模式时,我收到以下消息的错误:
只有在使用以下代码创建按钮副本时才能设置事件处理程序:
var inlineButton : Button? = null;
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
inlineButton = findViewById(R.id.btn_inline)
val inlineButtonCopy = inlineButton;
if (inlineButtonCopy != null) {
inlineButtonCopy.setOnClickListener({
NotificationToast(this,inlineButtonCopy.text.toString()).Show();
})
}
}
我想知道是否可以在顶层只创建一个 Button 实例,在 oncreate 中对其进行初始化,然后设置事件处理程序。如果我只能创建一个实例,我可以使用该事件来更改同一按钮的 属性。这是默认行为还是我遗漏了什么。
非常感谢任何澄清。
在 kotlin 中,您不需要描述 Button。可以直接调用id,设置Listener。它比 java 更容易。只是不要混淆您的 ID
btn_inline.setOnClickListener({
NotificationToast(this,inlineButtonCopy.text.toString()).Show();
})
在 Kotlin 中,您不需要定义 XML 组件的 Id's
。
您可以在 Id's
的帮助下直接访问 已经在您的 XML 中定义。
假设您在 XML 中定义的 Button
Id 是 btn_inline
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
btn_inline.setOnClickListener({
NotificationToast(this,inlineButtonCopy.text.toString()).Show();
})
}
此外,请确保 import
部分中应包含此类内容。
import kotlinx.android.synthetic.main.activity_main.*
请在你这边检查一下。
另一种选择是使用 Late-Initialized Property:
private lateinit var inlineButton: Button
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
inlineButton = findViewById<Button>(R.id.btn_inline)
inlineButton.setOnClickListener {
NotificationToast(this,inlineButtonCopy.text.toString()).Show();
}
}