通过 XML 和 Java 代码使用 OnClickListener 接口有何不同? [复制]

Posted

技术标签:

【中文标题】通过 XML 和 Java 代码使用 OnClickListener 接口有何不同? [复制]【英文标题】:How is using OnClickListener interface different via XML and Java code? [duplicate] 【发布时间】:2012-02-17 03:09:49 【问题描述】:

可能重复:Difference between OnClick() event and OnClickListener?

我对 android 开发是半新的,当我第一次开始时,我试图以任何必要的方式避免使用 xml 布局,因此我早期的一些项目涉及显式创建 OnClickListener 并将其实现为匿名内部类的按钮.比如-

final Button button = new Button(this);
button.setText("Click to change second line of text");

OnClickListener buttonListener = new View.OnClickListener() 
    boolean clicked = false;
    int numClicks = 0;

    @Override
    public void onClick(View v) 
        if(numClicks > 5) 
            button.setText("STOP IT");
        
        numClicks++;
        if(clicked == false)
            clicked = true;
            tv2.setText("Text Changed on Button Click");    
        
        else
        
            clicked = false;
            tv2.setText("Click again");
               
    
;
button.setOnClickListener(buttonListener);

但是随着我对android越来越熟悉,我开始理解xml布局的价值,并像这样实现按钮

    <Button
    android:id="@+id/button1"
    android:layout_height = "wrap_content"
    android:layout_width ="wrap_content"
    android:text = "lets do this"
    android:onClick = "DoIt"
    />

在布局xml中,DoIt是在java中定义的。

我的问题是,这两种方法在功能上是一样的吗?编译器是否在幕后某个地方定义了 OnClickListener?您是否通过一种方式或另一种方式权衡了任何功能?

【问题讨论】:

Here is a useful discussion 我想对你的问题有帮助。 您可以通过三种方式设置点击监听器,1.为每个元素设置单独的点击监听器。 2.在activity中实现OnClickListener。 3.创建一个单独的函数来处理按钮点击并在xml中添加这个函数。你可以在这里找到这些例子wiki.workassis.com/android-three-ways-to-set-click-listener 【参考方案1】:

这些完全一样。 android:onClick 被添加到 API 级别 4 中,以使其更容易、更像 javascript 网络,并从 XML 驱动一切。它在内部所做的是在 Button 上添加一个 OnClickListener,它会调用您的 DoIt 方法。

这是在内部使用 android:onClick="DoIt" 所做的:

Button button= (Button) findViewById(R.id.buttonId);
button.setOnClickListener(new View.OnClickListener() 
    @Override
    public void onClick(View v) 
        DoIt(v);
    
);

使用android:onClick 与 XML 配置一样,唯一需要权衡的是添加动态内容变得有点困难(以编程方式,您可以根据变量决定添加一个或另一个侦听器) .但这很容易通过在 DoIt 方法中添加测试来解决。

【讨论】:

优秀的答案。感谢您解释 Android 在通过 XML 设置回调时在幕后做了什么。 值得注意的是,android:onClick 不适用于片段中定义的方法。恕我直言,最好的解决方案是将侦听器附加到片段中。欲了解更多信息:***.com/questions/6091194/… 感谢您的简短解释。 当我们说 new View.OnClickListener() 时会实例化哪个类,以及作为 setOnClickListener 的参数传入的实例。【参考方案2】:

使用 XML,您需要自己设置 onclick 监听器。首先让您的班级implements OnClickListener 然后添加变量Button button1; 然后将其添加到您的onCreate()

button1 = (Button) findViewById(R.id.button1);
button1.setOnClickListener(this);

当你实现 OnClickListener 时,你需要添加继承方法 onClick() 来处理你的点击

【讨论】:

【参考方案3】:

即使您在 XML 中定义了 android:onClick = "DoIt",您也需要确保您的活动(或视图上下文)具有以完全相同的名称和视图作为参数定义的公共方法。 Android 将您的定义与活动中的此实现联系起来。最后,实现将具有您在匿名内部类中编写的相同代码。因此,简单来说,您将拥有一个带有实现代码的公共方法,而不是在活动中拥有内部类和侦听器附件。

【讨论】:

我确实在我的java中实现了它,我只是没有发布它,因为该方法与问题无关。

以上是关于通过 XML 和 Java 代码使用 OnClickListener 接口有何不同? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

创建委托 LdapAuthenticationProvider 而不使用 xml 配置,而不是通过 java 代码

使用Java代码和注解完成Spring配置

通过JAXB完成Java对象与XML之间的转换

通过 Java 从示例 XML 创建 SOAP 消息

使用freemarker生成的word文档,如何利用java代码将其转换为pdf格式?

玩转Java对象和XML相互转换