【问题标题】:Why does an action for a view (Button in this case) have to take a View as a parameter?为什么视图的操作(在这种情况下为按钮)必须将视图作为参数?
【发布时间】:2013-11-25 08:51:10
【问题描述】:

我是 android 开发的新手,但不是真正的 Java。

我不明白为什么我在Button中定义的方法必须以View为参数。

例如..

在 XML 中

<Button
        android:id="@+id/button1"
        //etc..
        //etc..
        android:onClick="displayText" /> 

可以看出,这是onClick方法。 当我编写 Java 代码时,方法 displayText 将像这样定义

public void displayText(View view){
        TextView myTextView = (TextView)findViewById(R.id.textView1);
        myTextView.setVisibility(View.VISIBLE);
    }

当一切正常时,我最初隐藏的文本将通过简单的单击按钮显示出来。

当我从该方法中删除参数View view 时,当我尝试单击按钮时应用程序崩溃。

我不明白为什么。

我不一定对参数中的view 做任何事情。 在非 android 开发中,我可以使用参数中的 view 并用它做事.. 但我没有看到我正在用这个参数做任何事情.. 那么为什么在这个方法中需要它?

【问题讨论】:

  • "...那么为什么在这个方法中需要它?" 因为您可以有多个可能使用相同 OnClickListener 的 Button(或其他扩展 View 的类)。为了确定点击了哪一个,您将使用view.getId() 上的开关/案例块切换,它返回由android:id= 设置的资源ID。

标签: java android methods parameters


【解决方案1】:

潜在地,相同的方法可以用于处理多个视图的点击事件。 View view 参数会让您知道哪一个是事件的来源。 IE。点击了哪个按钮。

之所以需要它是因为它必须与界面相匹配。尝试将 XML 中的函数名称与可用函数匹配时,找不到。

【讨论】:

    【解决方案2】:

    按钮是视图的子类。因此,当方法采用 View 时,意味着它们可以获取 Button 作为输入,也可以获取 View 的其他子类。

    View在参数中给出,所以你可以修改被点击的View。

    顺便说一句,我不知道你可以实现这样的点击监听器。我通常这样做:

    button.setOnClickListener(new OnClickListener(){
        @Override
        public void onClick(View view){
            // handle
        }
    });
    

    【讨论】:

    • “通常你会这样做:” - 我很少这样做。通常我有一个Activity 直接实现View.OnClickListener 接口,然后覆盖onClick(...) 作为Activity 本身的方法。如果您没有多个匿名 OnClickListener 实例,则如果您有很多按钮,则更清洁。
    • 是的,我有时也会这样做。编辑了我的答案,以避免对一般情况下的正常做出陈述。
    【解决方案3】:

    我搜索了 Stackoverflow,但从未找到适合我正在寻找的问题,所以我提出了这个问题。

    这里给出的两个答案对于我来说有点太短了,无法围绕一个有参数但从不使用它们的方法。

    然后我查看了旁边的“相关”部分,发现一个问题比我的措辞更好,答案更长,更能满足我的问题并回答得更详细。

    感谢所有在这里回复的人。如果其他人发现他们自己遇到了同样的问题,这里是帮助我理解它的问题/答案。

    Why do android methods accept View objects, but the objects are unused?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-19
      • 1970-01-01
      • 1970-01-01
      • 2021-11-23
      • 1970-01-01
      • 2016-06-02
      • 1970-01-01
      • 2017-11-26
      相关资源
      最近更新 更多