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

可能的重复:
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

这些都是完全相同的。 在API级别4中添加,以使其更容易,更像Javascript-web,并从XML驱动所有内容。它在内部执行的操作是在 Button 上添加一个,它调用你的方法。android:onClickOnClickListenerDoIt

以下是在内部使用 a 执行的操作:android:onClick="DoIt"

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

像往常一样,使用 XML 配置时,您唯一需要权衡的是,添加动态内容变得更加困难(从程序上讲,您可以决定根据变量添加一个或另一个侦听器)。但是,通过在方法中添加测试很容易被击败。android:onClickDoIt


答案 2

使用XML,您需要自己设置点击侦听器。首先让你的类,然后添加变量,然后将其添加到你的implements OnClickListenerButton button1;onCreate()

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

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


推荐