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

Sma*_*ode 68 java xml android android-layout android-button

可能重复:
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);
Run Code Online (Sandbox Code Playgroud)

但随着我越来越熟悉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"
    />
Run Code Online (Sandbox Code Playgroud)

在布局xml中,DoIt在java中定义.

我的问题是,这两种方法在功能上是一回事吗?是否有一个OnClickListener由编译器在幕后的某个地方定义?您是否有使用这种或那种方式进行权衡的功能?

Gui*_*ume 164

这些完全一样.android:onClick在API级别4中添加了它,使其更容易,更像Javascript-web,并从XML驱动所有内容.它内部的作用是OnClickListener在Button上添加一个调用DoIt方法的按钮.

以下是android:onClick="DoIt"内部使用的内容:

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

android:onClick与通常的XML配置一样,您唯一能够使用的是,添加动态内容变得有点困难(以编程方式,您可以决定根据变量添加一个或另一个侦听器).但是通过在DoIt方法中添加测试很容易就会失败.

  • 值得注意的是,`android:onClick`不适用于片段中定义的方法.imho的最佳解决方案是在片段中附加侦听器.欲了解更多信息:http://stackoverflow.com/questions/6091194/how-to-handle-button-clicks-using-the-xml-onclick-within-fragments (6认同)