在Kotlin / Android中将视图作为参数传递

时间:2019-01-28 11:08:09

标签: java android kotlin

kotlin / android的新手,请原谅我的初学者技能。

但是,为什么View在通常应该onClick(v: View)的{​​{1}}中传递? (例如typeInt)等

我认为这不可能/不允许。

我的代码:

String

是因为function是用Java而不是Kotlin编写的吗?

3 个答案:

答案 0 :(得分:2)

因为

1。我们单击View可能是ButtonTextViewEditText或任何布局,因此基于整数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的数据类型。它是许多孩子的父类,例如ButtonTextView等。这意味着onClick方法可以接收ButtonTextView,{{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 .:我没有运行这段代码。可能有一些错误。