kotlin / android的新手,请原谅我的初学者技能。
但是,为什么View
在通常应该onClick(v: View)
的{{1}}中传递? (例如type
,Int
)等
我认为这不可能/不允许。
我的代码:
String
是因为function是用Java而不是Kotlin编写的吗?
答案 0 :(得分:2)
因为
1。我们单击View
可能是Button
,TextView
,EditText
或任何布局,因此基于整数ID很难与实际匹配视图。
2。View
包含许多信息,包括其ID,可以像(标记,文本等)那样使用。
3。视图也有其父级Layout Information可以使用。
请在以下链接中找到更多详细信息:
Why do we have to add 'View' as parameter in onClick method and what it does?
视图class
的{{1}}具有方法interface
。
onClick(View view)
答案 1 :(得分:1)
MainActivity
类正在实现View.OnClickListener
接口,该接口具有以下签名:
public interface OnClickListener {
void onClick(View v);
}
因此,实现了onClick
方法,并且该方法接收了View
作为参数。
v
-是被单击的视图。
添加:
Kotlin中覆盖的onClick
方法的语法如下:
override fun onClick(v: View) { ... }
其中v
-是被点击的视图; View
-是Android SDK中对象v
的数据类型。它是许多孩子的父类,例如Button
,TextView
等。这意味着onClick
方法可以接收Button
,TextView
,{{1 }}和其他从ImageView
继承的视图。这是OOP的原理之一-多态。
答案 2 :(得分:0)
“视图”属性会告知您单击了哪个视图(Android的每个可视组件都是一个视图),因此您可以使用此信息来识别“谁”正在调用onClick。
如果在我的布局中我有3个按钮(button1,button2,button3),则可以执行以下操作(在Java中):
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
...
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
button1 = findViewById(R.id.button1);
button2 = findViewById(R.id.button2);
button3 = findViewById(R.id.button3);
button1.setOnClickListener(this);
button2.setOnClickListener(this);
button3.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch(view.id) {
case R.id.button1:
button1Action();
break;
case R.id.button2:
button2Action();
break;
case R.id.button3:
button3Action();
break;
}
}
或者您可以执行类似操作,而忽略View属性
public class MainActivity extends AppCompatActivity {
...
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
button1 = findViewById(R.id.button1);
button2 = findViewById(R.id.button2);
button3 = findViewById(R.id.button3);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
button1Action();
}
});
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
button2Action();
}
});
button3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
button3Action();
}
});
}
PS .:我没有运行这段代码。可能有一些错误。