使用OnClickListener接口在XML和Java代码中有何不同?

71

可能是重复问题:
OnClick()事件和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被编译器在幕后进行了定义?使用其中一种方法会有任何特性上的权衡吗?

1
这里有一个有用的讨论链接,我认为会对你的问题有所帮助:https://dev59.com/eGs05IYBdhLWcg3wFOG8#7453469。 - Vic Vuci
您可以通过三种方式设置点击监听器:1.为每个元素设置单独的点击监听器。2.在活动中实现OnClickListener。3.创建一个单独的函数来处理按钮点击,并将此函数添加到xml中。您可以在此处找到这些示例http://wiki.workassis.com/android-three-ways-to-set-click-listener/。 - Bikesh M
3个回答

173

这两者完全相同。 android:onClick 在API Level 4 中被添加,旨在使其更加易于使用、更像JavaScript-Web,并从XML中驱动一切。它在内部执行的操作是在按钮上添加一个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设置回调时背后的处理过程。 - Joshua Pinter
6
值得注意的是,android:onClick 不适用于在片段中定义的方法。我认为最好的解决方案是在片段内添加监听器。欲了解更多信息,请参见:https://dev59.com/8m025IYBdhLWcg3wSkAq。 - adamdport
感谢简要说明。 - Sandeep Yohans
当我们使用new View.OnClickListener()语句实例化一个对象时,会实例化哪个类?并且传入的参数是哪个类的实例? - Tom Shaw

4
使用XML,您需要自己设置onclick监听器。首先让您的类实现OnClickListener,然后添加变量Button button1;,最后将其添加到onCreate()中。
button1 = (Button) findViewById(R.id.button1);
button1.setOnClickListener(this);

当您实现 OnClickListener 时,需要添加继承的方法 onClick(),在这里您将处理您的点击事件


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

1
我已经在我的Java中实现了它,只是因为该方法与问题无关,所以我没有发布它。 - SmashCode

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接