0
public class CheckBoxDemo extends Activity implements
    CompoundButton.OnCheckedChangeListener {
  CheckBox cb;

  @Override
  public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    setContentView(R.layout.main);

    cb=(CheckBox)findViewById(R.id.check);
    cb.setOnCheckedChangeListener(this);
  }

  public void onCheckedChanged(CompoundButton buttonView,
                               boolean isChecked) {
    if (isChecked) {
      cb.setText(R.string.checked);
    }
    else {
      cb.setText(R.string.unchecked);
    }
  }
}

我难以理解的是,这条线在传入这个参数的情况下是如何工作的

cb.setOnCheckedChangeListener(this);

此外,该方法onCheckedChanged并未在任何地方显式调用,Android 如何建立连接以将复选框状态连接到方法名称。

4

3 回答 3

2

您正在实现接口并且onCheckedChanged() 您的代码中。您的 Activity 现在也是 Listener。

实现接口时,还必须重写接口指定的方法。这意味着实现该接口的类现在可以充当该接口的实例。

public class CheckBoxDemo extends Activity implements
CompoundButton.OnCheckedChangeListener {

你的CheckBoxDemo类实现OnCheckedChangeListener了,所以它现在可以作为一个OnCheckedChangeListener如果它需要的话。

然后稍后在您的代码中

public void onCheckedChanged

这是接口中CheckBoxDemo需要实现的方法才能使一切正常工作。

因此,您现在可以使用this(引用您当前的CheckBoxDemo实例)传递给,setOnCheckedChangeListener ()因为所有先前的条件都已满足 - 您的类现在可以成功侦听检查事件。

有关更多信息,请阅读java 教程中的接口

于 2013-01-07T21:25:53.490 回答
1

当你声明你的类时,它实现了一个从类调用的接口OnCheckedChangeListenerCompoundButton

implements
    CompoundButton.OnCheckedChangeListener 


当您使用this时,它指的是您正在使用的 this 对象,它是OnCheckedChangeListener.
当您实现 aInterfaceInterfacehas 方法时,您的Activity(或任何这样做的类)必须实现该方法。在您的情况下,它是onCheckedChanged(),因此您的 JVM 将知道建立这种关系。

于 2013-01-07T21:27:37.177 回答
1

您可以查找 的源代码CheckBox,但它的工作原理非常粗略(这不是代码的摘录,而是对其外观的演示):

public class CheckBox implements ... {
  private OnCheckedChangeListener occl;
  public void setOnCheckedChangeListener(OnCheckedChangeListener newlistener) {
    occl = newlistener;
  }
  /* this will be called when you click the CheckBox */
  public void check(...) {
      /* draw the check mark and similar things, then: */
      occl.onCheckedChanged(...);
  }
}

所以你onCheckedChanged()实际上是被你的内部实现调用的Component,在这种情况下你的CheckBox.

于 2013-01-07T21:30:23.187 回答