android-layout button使用 - 按钮单击Android中的监听器




button图片 button设置背景图片 (4)

这些完全一样。 android:onClick是在API级别4中添加的,以使其更容易,更像Javascript-web,并从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方法中添加测试很容易就会失败。

可能重复:
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由编译器在幕后的某个地方定义? 您是否有使用这种或那种方式进行权衡的功能?


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

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

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


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


这似乎是谷歌内心的笑话。 它也是谷歌Chrome任务管理器中的特色。 除了一些工程师认为有趣之外,它没有任何意义。 如果你愿意的话,这本身就是一个目的。

  1. 在Chrome中,使用Shift + Esc打开任务管理器。
  2. 右键单击以添加Goats Teleported列。
  3. 奇迹。

关于太多传送的山羊,甚至有一个巨大的Chromium bug报告。

以下Chromium 源代码段HN注释中被盗。

int TaskManagerModel::GetGoatsTeleported(int index) const {
  int seed = goat_salt_ * (index + 1);
  return (seed >> 16) & 255;
}




android android-layout android-button