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

通过XML和Java代码使用OnClickListener接口有何不同?,java,android,xml,android-layout,android-button,Java,Android,Xml,Android Layout,Android Button,可能重复: 我是Android开发的新手,刚开始的时候,我试图避免通过任何必要的方式使用xml布局,因此我以前的一些项目涉及到显式创建OnClickListener的按钮,并将其实现为匿名内部类。比如- final Button button = new Button(this); button.setText("Click to change second line of text"); OnClickListener buttonListener = new View.OnClickLi

可能重复:

我是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);
但是随着我对安卓系统越来越熟悉,我开始理解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?是否有任何功能可以通过一种或另一种方式进行权衡?

这些功能完全相同
android:onClick
被添加到API级别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
方法中添加测试,这很容易被击败。

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

使用XML,您需要自己设置onclick侦听器。首先让类
实现OnClickListener
,然后添加变量
按钮1
然后将其添加到您的
onCreate()


当您实现OnClickListener时,您需要添加继承的方法
onClick()
,您将在其中处理单击操作

我认为这将有助于解决您的问题。您可以通过以下三种方式设置单击侦听器:1。为每个元素设置单个单击侦听器。2.在活动中实现OnClickListener。3.创建一个单独的函数来处理按钮单击,并在xml中添加此函数。你可以在这里找到这些例子,我确实在我的java中实现了它,我只是没有发布它,因为这个方法与这个问题无关。回答得很好。感谢您解释Android在通过XML设置回调时在幕后做了什么。值得注意的是,
Android:onClick
无法使用片段中定义的方法。imho的最佳解决方案是只在片段中附加侦听器。更多信息:感谢您的简要解释。当我们说new View.OnClickListener()时,哪个类是实例化的,哪个实例作为setOnClickListener的参数传入。
button1 = (Button) findViewById(R.id.button1);
button1.setOnClickListener(this);